0

こんにちは、これは Python の初心者です。デコレータに渡された優先度の値に応じて、どのクラス インスタンスをインスタンス化する必要があるかを決定する、優先順位付きのデコレータを作成したいと考えています。

# abstract class
class Base:
   def method1(self):
    pass

@deco(priority=1)
class A(Base):
    def method1(self):
        pass

@deco(priority=3)
class B(Base):
    def method1(self):
        pass

@deco(priority=2)
class C(B):
    def method1(self):
        pass

def return_class_obj():
# this method will return the object based upon the priority of the 
# class passed through decorator
4

2 に答える 2

1

次のようなものが必要なようです。

class Factory():
    registred = {}

    @classmethod
    def register(cls, priority):
        registred = cls.registred
        def inner(inner_cls):
            registred[priority] = inner_cls
            return inner_cls
        return inner
    @classmethod
    def get(cls):
        return min(cls.registred.items())[1]()

@Factory.register(3) 
class A():
    def test(self):
        print "A"

Factory.get().test()

@Factory.register(2)
class B():
    def test(self):
        print "B"

Factory.get().test()

@Factory.register(1)
class C(B):
    def test(self):
        print "C"

Factory.get().test()

これは出力されますABC

于 2012-10-28T08:12:19.227 に答える
0

と の実用的な実装を次に示しdecoますreturn_class_obj。デコレータは、優先順位付けされたサブクラスBaseを検索する属性にインストールしreturn_class_objます。

def deco(priority):
    def _deco(cls):
       cls._cls_priority = priority
       if not hasattr(Base, '_subclasses'):
          Base._subclasses = {}
       Base._subclasses[priority] = cls
       return cls
    return _deco

def return_class_obj():
    # return Base subclass with the highest priority
    return Base._subclasses[max(Base._subclasses)]

@デコレータを使用するときは、デコレータ呼び出しの前に を追加することを忘れないでください。そうしないと、デコレータはノーオペレーションになります。

于 2012-10-28T07:52:57.223 に答える