11

クラスがあるとしましょう

class SimpleGenerator(object):
    @classmethod
    def get_description(cls):
        return cls.name

class AdvancedGenerator(SimpleGenerator):
    @classmethod
    def get_description(cls):
        desc = SimpleGenerator.get_description() # this fails
        return desc + ' Advanced(tm) ' + cls.adv_feature

ここで、上記の各クラスを拡張して、それぞれの具体的なクラスを作成しました。

class StringGenerator(SimpleGenerator)
    name = 'Generates strings'
    def do_something():
        pass

class SpaceShuttleGenerator(AdvancedGenerator)
    name = 'Generates space shuttles'
    adv_feature = ' - builds complicated components'
    def do_something():
        pass

今、私が電話するとしましょう

SpaceShuttleGenerator.get_description()

問題は、クラスのインスタンスを渡す際にAdvancedGeneratorメソッドを呼び出したいことです。具体的には. これはできますか?SimpleGeneratorSpaceShuttleGenerator

注: 私の具体的な例はより複雑であるため、例は単純化されています。私の目標は文字列を連結することではないとしましょう。

4

1 に答える 1

12

使用super():

@classmethod
def get_description(cls):
    desc = super(AdvancedGenerator, cls).get_description()
    return desc + ' Advanced(tm) ' + cls.adv_feature

SimpleGenerator.get_description()との使用の違いsuper(AdvancedGenerator, cls).get_description()は、何clsに設定されるかです。クラスを直接呼び出す場合clsは に設定しSimpleGenerator、 を使用してsuper()cls参照しAdvancedGeneratorます。

__name__コードを比較してください (違いを説明するために使用するように調整されています)。

>>> class SimpleGenerator(object):
...     @classmethod
...     def get_description(cls):
...         return cls.__name__
... 
>>> class AdvancedGenerator(SimpleGenerator):
...     @classmethod
...     def get_description(cls):
...         desc = SimpleGenerator.get_description() 
...         return desc + ' Advanced(tm)'
... 
>>> AdvancedGenerator.get_description()
'SimpleGenerator Advanced(tm)'

と使用super()

>>> class AdvancedGenerator(SimpleGenerator):
...     @classmethod
...     def get_description(cls):
...         desc = super(AdvancedGenerator, cls).get_description()
...         return desc + ' Advanced(tm)'
... 
>>> AdvancedGenerator.get_description()
'AdvancedGenerator Advanced(tm)'
于 2013-03-08T10:04:52.497 に答える