先來介紹一下python的__call__函式,call的作用是什麼呢?舉個例子來說明一下:
>>> class a(object):
... def __init__(self):
... print 'a'
... def __call__(self):
... print 'call'
...
>>> a=a()
a>>> a()
call
據說a()這麼使用的時候相當於執行a.__call__(),我們暫且這麼理解,具體原因請參考專業文件,這裡看可能a()沒啥用,請繼續向後看。
接下來,說一下類的type,
>>> class b:
... def __init__(self):
... print 'b'
...
>>> b=b()
b>>> type(b)
>>> b
>>> type(b)
>>> type(type(b))
>>> b
由上面例子可以看出類,例項的資料型別。
之後用type函式,建立乙個類,type()函式,大致需要以下幾個引數,第乙個是類的name,第二個是這個類的父類,之後是屬性。這裡name指的是這裡面__main__後面跟的字元。為了保持一致,通常與類的名字一樣。
>>> a=type('a',(object,),)
>>> a
可以看出我們的類a已經建立成功
>>> type(a)
但是為什麼type(a)型別還是type,而不是呢?因為type(a)和type(type('a',(object,),))是一樣的,我猜classobj就是乙個別名,但是我們用最原始的方法沒顯示別名,所以只顯示type,但這不重要,重點是類已經建立了。那麼我們自己封裝乙個類繼承type去建立類呢?
>>> class mytype(type):
... def __init__(self,name,bases,dict):
... print 'mytype'
... def __call__(self,*args,**kwargs):
... print 'mytype call'
這裡我們引數和type的原始碼一致,相當於重寫了type的init和call,之後寫乙個b類,把b的__metaclass__指向mytype,
>>> class b:
... __metaclass__=mytype
... def __init__(self):
... print 'b'
>>> b=b()
mytype call
>>> b
例項化乙個b,可以看到,執行了mytype的init,但是b並沒有生成任何東西。
這裡解釋一下,當執行b=b()時,需要先找到類內部的__metaclass__並執行,按照__metaclass__順序先來執行__init__建立乙個最初的類,類需要例項化,當我們例項化時會呼叫metaclass的__call__函式(這樣使用b(),就解釋了上面的call方法),__call__函式內部正常會呼叫b類裡面的__new__方法來建立乙個類的物件,之後會呼叫b裡面的__init__函式給物件進行最初的包裝(把相關的引數賦值等操作),最後返回這個類的物件,再把這個物件付賦給b,這樣就完成了例項化的過程。因為mytype的__call__方法只列印了一串資訊,所以這個例項沒有值。也就是說正常建立乙個例項物件的其實是new而不是init,init只是起到乙個賦值的作用。下面**模擬一下類的例項化過程:
def __call__(self,*args,**kwargs):
print 'mytype call'
re=self.__new__(self,*args,**kwargs)
self.__init__(re)
return re
class b:
__metaclass__=mytype
def __init__(self):
self.name='b'
print 'b'
def __new__(cls,*args,**kwargs):
return object.__new__(cls,*args,**kwargs)
def func(self):
print 'func'
def __call__(self):
print 'call'
b=b()
print b
print b.name
執行結果如下:
mytype
mytype call
b<__main__.b object at 0x7fd84d7ae710>
b
python 類 建立類和使用類
coding utf 8 目標 建立 狗這個類 例項化並呼叫 屬性與函式 created on sat nov 16 23 05 32 2019 author huzhenxing class dog 一次模擬小狗的簡單嘗試 def init self,name,age 初始化屬性 name 和 a...
Python 類 類的建立及操作
1,類的建立 class person object init函式是乙個建構函式,在建立例項過程中自動執行,為例項的初始化工作。name為init函式的區域性變數,self.name是例項的屬性,二者看似相同,實則區別很大。通過self.name name的方式,我們可以把name屬性賦值給self...
細說python類2 類動態新增方法和slots
先說一下類新增屬性方法和例項新增屬性和方法的區別,類新增屬性屬於加了乙個以類為全域性的屬性 據說叫靜態屬性 那麼以後類的每乙個例項化,都具有這個屬性。給類加乙個方法也如此,以後類的每乙個例項化都具備這個方法 但是據說叫動態方法。但是給例項加乙個屬性,作用域就是這個例項,是與類沒關係的 據說這種屬性叫...