2012-10-26 67 views
1

我正在玩Python 2.7中的元類。所以,我創建了一個看起來像這樣的代碼:具有自定義元類行爲的Python元類

class M(type): 
    def __new__(meta, name, parents, attrs): 
     print 'In meta new' 
     return super(meta, meta).__new__(meta, name, parents, attrs) 

    def __init__(cls, *args, **kwargs): 
     print 'In meta init' 

    def __call__(cls, *attr, **val): 
     print 'In meta call' 
     return super(cls, cls).__new__(cls) 

class A(object): 
    __metaclass__ = M 

    def __new__(cls): 
     print 'In class new' 
     return super(cls, cls).__new__(cls) 

    def __init__(self): 
     print 'In object init' 

    def __call__(self): 
     print 'In object call' 

但產量混淆了我:

A() 

In meta new 
In meta init 
In meta call 

不知何故類方法__ __新和__ __的init被覆蓋,所以解釋只是跳過他們。任何人都可以解釋這個東西

感謝您的幫助。

回答

1

您打電話給super()的方式不正確。 super()的第一個參數應該是類本身,而不是它的實例。

return super(meta, meta).__new__(meta, name, parents, attrs) 

應該是...

return super(M, meta).__new__(meta, name, parents, attrs) 

等爲其他super()電話 - 第一個參數應該是他們中的類;第二個是實際的實例。

+0

這是以其他方式工作,並非因此。 – alexvassel

0

它不工作,因爲我不使用原點的Python機制 - cls(),其擔保​​的__new____init__方法自動工作,它是由元類__call__方法,它不會做同樣的覆蓋。

相關問題