python定義類的初始化方法-Python學習網
通俗的講解Python中的__new__()方法_SJ2050的博客-CSDN博客_python__new__
python中沒有類構造器。
__new__和__init__相配合才是python中真正的類構造器。
__new__ 是創建一個實例,__init__ 是初始化一個實例。
當生成一個實例時,先執行__new__,創建一個實例,再執行__init__來初始化這個實例
1、當類的初始化時,類中的方法__init__可以被直接定義,它在實例生成時執行,並且類中的方法與普通函數有很小的區別。
2、一個類中的方法必須包含一個關鍵字self,也就是instance本身。
這個關鍵字可以是任意變量名,只是通常使用self。
實例
聲明一個類,並為類添加初始化方法。
# 定義類
class MyClass:
# 初始化方法,第一個參數為對象本身 self,第二個參數為實例化時必須傳遞的參數
def __init__(self, name):
print(name)
# 類的調用,只需要傳遞 name 參數即可
c = MyClass("橡皮擦")
class CapStr(str):
def __new__(cls, string):
self_in_init = super().__new__(cls, string)
print(id(self_in_init))
return self_in_init
def __init__(self,string):
print(id(self))
a = CapStr("I fu Ch!")
print(id(a))
1、__new__方法的第一個參數是這個類,而其余的參數會在調用成功後全部傳遞給__init__方法初始化
我們比較兩個方法的參數,可以發現__new__方法是傳入類(cls),而__init__方法傳入類的實例化對象(self)。
而有意思的是,__new__方法返回的值就是一個實例化對象(ps:如果__new__方法返回None,則__init__方法不會被執行,並且返回值只能調用父類中的__new__方法,而不能調用毫無關系的類的__new__方法)。
我們可以這麼理解它們之間的關系,__new__是開辟疆域的大將軍,而__init__是在這片疆域上辛勤勞作的小老百姓,只有__new__執行完後,開辟好疆域後,__init__才能工作,結合到代碼,也就是__new__的返回值正是__init__中self。
1、__del__方法稱為析構方法,用於實現對象被銷毀所需的操作。Ex:釋放對象占用的資源、打開的文件資源、網絡連接等。
Python實現自動垃圾回收,當對象未被引用(引用計數為0)時,垃圾回收器調用__del__方法。
2、用del語句刪除對象,確保調用系統自動提供的__del__方法,一般不需要自定義析構方法。
實例:
class Person:
def __del__(self):
print("銷毀對象:{0}".format(self))
p1 = Person() # 5. 銷毀對象:<__main__.Person object at 0x000001DFCD279FC8>
print(id(p1)) # 1. 2060731260872
p2 = Person() # 3. 銷毀對象:<__main__.Person object at 0x000001DFCD284088>
print(id(p2)) # 2. 2060731302024
del p2
print("over") # 4. over
# print(id(p2)) # name 'p2' is not defined