對python元類概念的理解

2022-03-21 13:51:06 字數 2065 閱讀 7695

以下內摘自《

python

中的元類程式設計》

清單1.

老式的python 1.5.2

類工廠 python 1.5.2 (#0, jun 27 1999, 11:23:01) [...]

>>> def class_with_method(func):

...class klass: pass

...setattr(klass, func.__name__, func)

...return klass

...>>> def say_foo(self): print 'foo'

...>>> foo = class_with_method(say_foo)

>>> foo = foo()

>>> foo.say_foo()

foo工廠函式

class_with_method()

動態地建立乙個類,並返回該類,這個類包含傳遞給該工廠的方法/函式。在返回該類之前,在函式體內操作類自身。

new

模組提供了更簡潔的編碼方式,但其中的選項與類工廠體內定製**的選項不同,例如:

清單2. new

模組中的類工廠

>>> from new import classobj

>>> foo2 = classobj('foo2',(foo,),)

>>> foo2().bar()

'bar'

>>> foo2().say_foo()

foo清單3.

作為類工廠元類的

type

>>> x = type('x',(),)

>>> x, x().foo()

(, 'foo')

清單4.

作為類工廠的

type

後代 >>> class chattytype(type):

...def __new__(cls, name, bases, dct):

...print "allocating memory for class", name

...return type.__new__(cls, name, bases, dct)

...def __init__(cls, name, bases, dct):

...print "init'ing (configuring) class", name

...super(chattytype, cls).__init__(name, bases, dct)

...>>> x = chattytype('x',(),)

allocating memory for class x

init'ing (configuring) class x

>>> x, x().foo()

(, 'foo')

清單5.

將類方法附加在所生成的類上

>>> class printable(type):

...def whoami(cls): print "i am a", cls.__name__

...>>> foo = printable('foo',(),{})

>>> foo.whoami()

i am a foo

>>> printable.whoami()

traceback (most recent call last):

typeerror:unbound method whoami() [...]

清單6.

用類屬性設定元類

>>> class bar:

...__metaclass__ = printable

...def foomethod(self): print 'foo'

...>>> bar.whoami()

i am a bar

>>> bar().foomethod()

foo參考:

python

中的元類編

程 python

中的元類程式設計,第2 部

分 python

中的元類程式設計,第3 部

python 元類的理解

簡單的講,元類建立了python中所有的物件。我們說python是一種動態語言,而動態語言和靜態語言最大的不同,就是函式和類不是編譯時定義的,而是執行時動態建立的。class的定義是執行時動態建立的,而建立class的方法就是使用type 函式。type 函式既可以返回乙個物件的型別,又可以建立出新...

python 元類 python元類深入理解

1.python 中的類 在python中,類也是乙個物件,只不過這個物件擁有生成例項的能力,我們一般使用class 來定義乙個類,在python直譯器執行到這個地方的時候會自動建立出這個物件,python也為我們提供了手動建立類的方法,type type 這個方法對我們來說並不陌生,我們所熟知的用...

自己對Python 類的理解

class pet object 父類 類屬性 speed grow 0.02 def init self,age age 物件屬性 self.age age 類方法 classmethod defgrowth cls,time return cls.speed grow time 靜態方法 sta...