__new__ : 建立物件
__init__ : 初始化物件
classfoo(object):
def__init__
(self):
print("
初始化物件")
def__new__(cls, *args, **kwargs):
print("
建立物件")
return object.__new__
(cls)
obj =foo()
# 以上**執行結果是:
#建立物件
#初始化物件
由此可以看出, python物件導向中 建立物件 的過程是:
(1)執行 __new__ 方法, 最後的返回值才是例項化物件, 這一步是建立物件的過程.
(2)執行 __init__ 方法, 把建立好的物件進行初始化.
__call__ : 在物件後面接乙個括號, 表示觸發執行__call__方法
classfoo:
def__call__(self, *args, **kwargs):
print("
正在執行__call__方法")
obj = foo() #
執行__new__方法, 執行__init__方法
obj() #
執行__call__方法
#以上**執行結果:
#正在執行__call__方法
補充: python內建函式callable的用法
callable()
描述: callable() 函式用於檢查乙個物件是否是可呼叫的. 如果返回true, object可能呼叫成功也可能呼叫失敗, 視情況而定. 但如果返回false, 呼叫物件ojbect絕對不會成功.簡單來講, 只要內部有__call__方法都返回 true.
語法: callable(object)
引數: object -- 物件
返回值: 若物件可被呼叫返回true, 否則返回false.
例1:
classa:
defmethod(self):
pass
print(callable(a)) #
類都是可呼叫的, 返回true
a =a()
print(callable(a)) #
物件a沒有實現__call__方法,返回false
例2:
classb:
def__call__
(self):
pass
print(callable(b)) #
類返回true
b =b()
print(callable(b)) #
物件b實現了__call__方法,返回true
用於索引操作, 與字典的操作方法類似. 以上三者分別表示獲取、設定、刪除資料.
classfoo:
def__getitem__
(self, key):
print("
正在呼叫__getitem__方法, 獲取到的key是%s
" %key)
def__setitem__
(self, key, value):
print("
正在呼叫__setitem__方法, 此時key是'%s', value是'%s'
" %(key, value))
def__delitem__
(self, key):
print("
正在呼叫__delitem__方法, 要刪除的key是%s
" %key)
obj =foo()
result = obj["
王力巨集"] #
預設執行__getitem__方法
obj["
汪峰"] = "
樂壇半壁江山"#
預設執行__setitem__方法
del obj["
王力巨集"] #
預設執行__delitem__方法
#以上**執行結果:
#正在呼叫__getitem__方法, 獲取到的key是王力巨集
#正在呼叫__setitem__方法, 此時key是'汪峰', value是'樂壇半壁江山'
#正在呼叫__delitem__方法, 要刪除的key是王力巨集
__str__ : 如果乙個類中定義了__str__方法, 那麼在列印物件時, 預設輸出該方法的返回值.
classfoo:
def__str__
(self):
return
"我使用了__str__方法
"obj =foo()
(obj)
#以上**執行結果:
#我使用了__str__方法
__dict__ : 獲取到類或物件中的所有成員.
class foo:passprint(foo.__dict__) #
獲取類foo中的所有成員
以上**執行結果是:
__iter__用於迭代器,之所以列表、字典、元組可以進行for迴圈,是因為這些型別的內部定義了 __iter__ 方法.
現在用以下步驟來說明__iter__的作用:
第一步:
class foo(object): passobj =foo()
for i in obj: print
(i)#
執行結果:
#typeerror: 'foo' object is not iterable
#報錯結果顯示: 'foo'類物件是不可迭代的
第二步:
classfoo(object):
def__iter__
(self):
pass
obj =foo()
for i in
obj:
(i)#
執行結果:
#typeerror: iter() returned non-iterator of type 'nonetype'
#報錯結果顯示: iter方法沒有返回乙個迭代器
第三步:
classfoo(object):
def__init__
(self, iteration):
self.iteration =iteration
def__iter__
(self):
return
iter(self.iteration)
obj = foo([11, 22, 33])
for i in
obj:
(i)#
執行結果:#11
#22#33
從以上步驟可以看出, for迴圈迭代的其實是 iter([11, 22, 33]), 所以執行流程可以變更為:
obj = iter([11, 22, 33])for i in obj: print(i)
__class__ : 表示當前操作的物件的類是什麼.
__module__ : 表示當前操作的物件在哪個模組.
class foo:passobj =foo()
print(obj.__class__) #
當前操作的物件的類是foo
print(obj.__module__) #
當前操作的物件在__main__模組中
#以上**執行結果:##
__main__
python類成員 Python 類的特殊成員解析
類的成員有兩種形式 公有成員,在任何地方都能訪問 私有成員,只有在類的內部才能方法,私有成員命名時,前兩個字元是下劃線。class foo def init self,name,age self.name name self.age age def show self 間接方法私有字段 return...
Python物件導向程式設計(5) 類的特殊方法
類的特殊方法 1 深入理解類 類本質上也是乙個物件,只是其擁有建立自身例項的能力 類可以與變數進行繫結,並且可以為類增加屬性 可以把類作為函式的引數傳遞 2 元類 類的建立和管理者 type 所有的類都是元類的例項 isinstance empty,type 檢視empty是否是type的例項 類例...
Python物件導向特殊成員
類的特殊成員之call usr bin env python coding utf 8 class specialmembers 類的構造方法 def init self print my blog is url 物件的構造方法 def call self print my name is yang...