Python 物件導向 類的特殊成員

2022-04-22 11:30:09 字數 3984 閱讀 3058

__new__ : 建立物件

__init__ : 初始化物件

class

foo(object):

def__init__

(self):

print("

初始化物件")

def__new__(cls, *args, **kwargs):

print("

建立物件")

return object.__new__

(cls)

obj =foo()

# 以上**執行結果是:

#建立物件

#初始化物件

由此可以看出, python物件導向中 建立物件 的過程是:

(1)執行 __new__ 方法, 最後的返回值才是例項化物件, 這一步是建立物件的過程.

(2)執行 __init__ 方法, 把建立好的物件進行初始化.

__call__ :  在物件後面接乙個括號, 表示觸發執行__call__方法

class

foo:

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:

class

a:

defmethod(self):

pass

print(callable(a)) #

類都是可呼叫的, 返回true

a =a()

print(callable(a)) #

物件a沒有實現__call__方法,返回false

例2:

class

b:

def__call__

(self):

pass

print(callable(b)) #

類返回true

b =b()

print(callable(b)) #

物件b實現了__call__方法,返回true

用於索引操作, 與字典的操作方法類似. 以上三者分別表示獲取、設定、刪除資料.

class

foo:

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__方法, 那麼在列印物件時, 預設輸出該方法的返回值.

class

foo:

def__str__

(self):

return

"我使用了__str__方法

"obj =foo()

print

(obj)

#以上**執行結果:

#我使用了__str__方法

__dict__ : 獲取到類或物件中的所有成員.

class foo:pass

print(foo.__dict__) #

獲取類foo中的所有成員

以上**執行結果是:

__iter__用於迭代器,之所以列表、字典、元組可以進行for迴圈,是因為這些型別的內部定義了 __iter__ 方法.

現在用以下步驟來說明__iter__的作用:

第一步:

class foo(object): pass

obj =foo()

for i in obj: print

(i)#

執行結果:

#typeerror: 'foo' object is not iterable

#報錯結果顯示: 'foo'類物件是不可迭代的

第二步:

class

foo(object):

def__iter__

(self):

pass

obj =foo()

for i in

obj:

print

(i)#

執行結果:

#typeerror: iter() returned non-iterator of type 'nonetype'

#報錯結果顯示: iter方法沒有返回乙個迭代器

第三步:

class

foo(object):

def__init__

(self, iteration):

self.iteration =iteration

def__iter__

(self):

return

iter(self.iteration)

obj = foo([11, 22, 33])

for i in

obj:

print

(i)#

執行結果:#11

#22#33

從以上步驟可以看出, for迴圈迭代的其實是 iter([11, 22, 33]), 所以執行流程可以變更為:

obj = iter([11, 22, 33])

for i in obj: print(i)

__class__ : 表示當前操作的物件的類是什麼.

__module__ : 表示當前操作的物件在哪個模組.

class foo:pass

obj =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...