以下內摘自《
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...