2016-05-26 13 views
1

クラスが完全に構築される前に呼び出されるメソッドでスーパー・ライクな動作を実装する方法を教えてください。このような一連の独立したメソッドを実装できますか? setup_classが呼び出されたときBが適切に存在しないためクラス構築中にメソッド継承を適切に実装する

from six import with_metaclass 

class Meta(type): 
    """a metaclass""" 

    def __init__(cls, name, bases, classdict): 
     cls.setup_class() 

    def setup_class(cls): 
     pass 


class A(with_metaclass(Meta, object)): 
    """a class""" 

    @classmethod 
    def instantiate(cls, name): 
     print("instantiating through '%s'" % name) 

    @classmethod 
    def setup_class(cls): 
     cls.instantiate('A') 


class B(A): 

    @classmethod 
    def setup_class(cls): 
     super(B, cls).setup_class() 
     cls.instantiate('B') 

class C(B) pass 

これは明らかに、しかし動作することはできません。

答えて

1

私はかなりしばらくの間、この質問を持っていたし、実際にメタクラスのこの側面を説明した記事を見つけることができませんでした。実際、私はこの代替品、そして最終的には不必要な、solutionを思い付くまでずっとそれを持っていました。技術的には、私が望んでいた構文(クールです)に厳密に準拠しますが、最終的にはハックです。無駄な(しかしまだクールな)コードの作成に長時間を費やして以来、私は少なくとも、同じものに誰も詰まっていないことを確かめてみました。

私の混乱は、私がメタクラスの理解とクラスとの関係を論理的な結論まで十分に拡張しなかったという事実から本当に生じました。だから、わかったように、私が望んでいた種類の継承を作成する最善の方法は、実際には一連のメタクラスの中でそれを実行することでした - クラスのインスタンスを通して属性を継承しようとするのと同じ理由で、

from six import with_metaclass 

class Meta(type): 
    """a metaclass""" 

    def __init__(cls, name, bases, classdict): 
     print("Beginning '%s' setup" % name) 
     cls.setup_class() 
     print("Finished '%s' setup \n" % name) 

    def setup_class(cls): 
     cls.attribute = 0 
     cls.instantiate('Meta') 


class AMeta(Meta): 

    def setup_class(cls): 
     super(AMeta, cls).setup_class() 
     cls.instantiate('A') 

    def instantiate(cls, name): 
     print("instantiating through '%s'" % name) 

class A(with_metaclass(AMeta, object)): pass 


class BMeta(AMeta): 

    def setup_class(cls): 
     super(BMeta, cls).setup_class() 
     cls.instantiate('B') 

class B(with_metaclass(BMeta, object)): pass 


class C(B): pass 

誰もがより徹底的にこれを調べるために気にした場合、私はそこに誰かがそれを感謝確信している:多型メタクラスのインスタンスを作成する感覚。

関連する問題