細說python類3 類的建立過程

2021-07-09 16:39:12 字數 2387 閱讀 7472

先來介紹一下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

先說一下類新增屬性方法和例項新增屬性和方法的區別,類新增屬性屬於加了乙個以類為全域性的屬性 據說叫靜態屬性 那麼以後類的每乙個例項化,都具有這個屬性。給類加乙個方法也如此,以後類的每乙個例項化都具備這個方法 但是據說叫動態方法。但是給例項加乙個屬性,作用域就是這個例項,是與類沒關係的 據說這種屬性叫...