程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python 構造類的基礎知識

編輯:Python

參考:

python定義類的初始化方法-Python學習網

通俗的講解Python中的__new__()方法_SJ2050的博客-CSDN博客_python__new__

總結:

python中沒有類構造器。

__new__和__init__相配合才是python中真正的類構造器。

__new__ 是創建一個實例,__init__ 是初始化一個實例。

當生成一個實例時,先執行__new__,創建一個實例,再執行__init__來初始化這個實例

一、__init__ 初始化

1、當類的初始化時,類中的方法__init__可以被直接定義,它在實例生成時執行,並且類中的方法與普通函數有很小的區別。

2、一個類中的方法必須包含一個關鍵字self,也就是instance本身。

這個關鍵字可以是任意變量名,只是通常使用self。

實例

聲明一個類,並為類添加初始化方法。

# 定義類
class MyClass:
# 初始化方法,第一個參數為對象本身 self,第二個參數為實例化時必須傳遞的參數
def __init__(self, name):
print(name)
# 類的調用,只需要傳遞 name 參數即可
c = MyClass("橡皮擦")

二、__new__() 創建實例

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。
 

三、__del__ 

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

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved