首先,什麼是魔法方法呢?在python中方法名如果是__***x__()的,那麼就有特殊的功能,因此叫做「魔法」方法。
之前我們是這樣給物件新增屬性的:
class student:
pass
stu1 = student()
stu1.name = "張三"
stu1.age = 18
現在我們利用__init__()方法簡化**
class student:
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = student("張三", 18)
是不是**看起來簡潔多了呢
沒有定義__str __()方法時:
'''
'''class student:
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = student("張三", 18)
print(stu1)
s = str(stu1)
print(s)
"""輸出結果:
<__main__.student object at 0x03c3bcd0>
<__main__.student object at 0x03c3bcd0>
"""
沒有定義__str __()方法時,它預設返回該物件的記憶體位址。
定義了__str __()方法是這樣的:
class student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "姓名:%s\t年齡:%d"%(self.name, self.age)
stu1 = student("張三", 18)
print(stu1)
s = str(stu1)
print(s)
"""輸出結果:
姓名:張三 年齡:18
姓名:張三 年齡:18
"""
當刪除乙個物件時,python直譯器會預設呼叫乙個方法,這個方法為__del__()方法。
首先應該先了解乙個概念,那就是物件的引用個數。我們需要sys模組中的getrefcount()用來測量乙個物件的引用個數,返回值=實際的引用個數+1。若返回2則說明該物件的實際引用個數為1,此時有1個變數引用了該物件。
import sys
class a:
pass
a = a()
# 現在只有變數a引用了a類建立的物件
print(sys.getrefcount(a))
"""輸出結果:
2"""
# 那麼現在再建立乙個變數b,也引用a所引用的物件,那麼它的引用個數就會加1,實際引用個數變成2.
b = a
print(sys.getrefcount(a))
"""輸出結果:
3"""
當python直譯器檢測到,這個物件的實際引用個數為0時,就會刪除這個物件,此時也就會相應的呼叫__del __()方法。還有一種情況就是該程式已經全部執行完了,那麼相應的記憶體會被釋放掉,它也會執行__del __()方法。
這是程式正常執行完的情況:
import sys
class a:
def __del__(self):
print("該物件被銷毀")
a = a()
"""輸出結果:
該物件被銷毀
"""
還有一種是手動刪除變數引用的情況:
import sys
class a:
def __del__(self):
print("該物件被銷毀")
a = a() # 此時實際引用個數為1
b = a # 此時實際引用個數為2
print("刪除了變數a")
del a # 刪除變數a,此時實際引用個數為1
print("刪除了變數b")
del b # 刪除變數b,此時實際引用個數為0,python直譯器就會刪除該物件,即呼叫__del __()方法
print("程式結束")
"""輸出結果:
刪除了變數a
刪除了變數b
該物件被銷毀
程式結束
"""
class a:
def __init__(self):
print("呼叫了init方法")
def __new__(cls):
print("呼叫了new方法")
return super().__new__(cls)
a = a()
"""輸出結果:
呼叫了new方法
呼叫了init方法
"""
**如下:
class a:
# 定義乙個私有的類屬性,用於儲存例項化出來的物件
_isinstance = none
def __new__(cls):
print("呼叫了new方法")
# 判斷如果_isinstance為none,則建立乙個例項,否則直接返回_isinstance
if not cls._isinstance:
cls._isinstance = super().__new__(cls)
return cls._isinstance
print(id(a))
print(id(a))
print(id(a))
print(id(a))
"""輸出結果:
19888488
19888488
19888488
19888488
"""
我們都知道python是一門動態語言,可以在程式執行的過程中新增屬性。如果我們想要限制例項的屬性該怎麼辦?例如,只允許對person例項新增name和age屬性。
為了達到限制的⽬的,python允許在定義class的時候,定義⼀個特殊的 __slots__變數,來限制該class例項能新增的屬性:
class person(object):
__slots__ = ("name", "age")
p = person()
p.name = "⽼王"
p.age = 20
p.score = 100
"""輸出結果:
traceback (most recent call last):
file "", line 6, in attributeerror: 'person' object has no attribute 'score'
"""
注意:使⽤__slots__要注意,__slots__定義的屬性僅對當前類例項起作⽤,對 繼承的⼦類是不起作⽤的。 Python常見的魔法方法
整理下python常用的魔法方法,後面我會就每一類的魔法方法,具體講解怎麼用。類別方法名 例項的建立 初始化和銷毀 new init del 屬性描述符 get set delete 跟類相關的服務 prepare instancecheck subclasscheck 上下文管理器協議 enter...
python基礎 python中常見魔法方法
new init str class person object def new cls,args,kwargs 申請記憶體空間 return object new cls def init self,name,age 將資料填充到申請好的那一段記憶體空間 param name 姓名 param a...
python中的魔法方法
python中以 包圍的都有特殊的意思,其中是方法的都是魔法方法。python中的魔法方法魔法的地方就是你不需要顯示的呼叫,就可以實現自動呼叫。比如,init 方法,你建立乙個物件的時候,你不需要呼叫這個方法,它就會自動呼叫這個方法了。豈不是很魔法 另外,python中還有其他的魔法方法。比如講,關...