2

スーパークラスからサブクラスをインスタンス化する必要があります。

class Superclass(object):
    @staticmethod
    def get_instance():
        #This should return an instance of subclass1 or subclass2

class Subclass1(Superclass):
    pass
class Subclass2(Superclass):
    pass

私が書きたい:

Subclass1.get_instance()

Subclass1のインスタンスを取得し、Subclass2についても同じです。

4

3 に答える 3

9

@classmethodの代わりに使用@staticmethod

class Superclass(object):
    @classmethod
    def get_instance(cls):
        #This should return an instance of subclass1 or subclass2
        return cls()

class Subclass1(Superclass):
    pass
class Subclass2(Superclass):
    pass
于 2013-01-06T20:04:52.307 に答える
1

__subclasses__特定のクラスのサブクラスのリストにアクセスする場合は、次のメソッドを使用できます。

>>> class MyClass(object):
...     pass
... 
>>> class Subclass1(MyClass):
...     pass
... 
>>> class Subclass2(MyClass):
...     pass
... 
>>> MyClass.__subclasses__()
[<class '__main__.Subclass1'>, <class '__main__.Subclass2'>]

既存のサブクラスをすでに知っている場合は、それらを直接インスタンス化できます。

>>> class MyClass(object):
...     def getInstance(self):
...             return Subclass1()
... 
>>> class Subclass1(MyClass): pass
... 
>>> MyClass().getInstance()
<__main__.Subclass1 object at 0x1e72d10>

とにかく、あなたはシングルトンパターンを実装しようとしていると思います。その場合、メソッドをまったく使用すべきではないと思いますgetInstance。以下を使用して実装するだけです。

  • モジュールはシングルトンであるため、モジュール
  • __new__インスタンスがすでに存在する場合は、古いインスタンスを返すように再実装します
  • いくつかのメタクラスを使用する

そして、これを行う方法は他にもたくさんあります。

これが目的でない場合は、スーパークラスは通常サブクラスについて知る必要がないため、設計を変更する必要があります。

于 2013-01-06T20:00:08.960 に答える
0

これを行う正しい方法は、classmethodを呼び出すことができない場合selfclass()、ファクトリメソッドを定義(または想定)し、スーパークラスメソッドにそのファクトリメソッドを呼び出させることselfです。

class Mixinator(object):

      @classmethod # this is not really necessary, but it means you don't need an instance to start with
      def factoryuser(selfclass, *args):
          return selfclass.factory(*args)


      #only define factory if you want Mixinator to be usable on its own
      @classmethod
      def factory(selfclass, *args):
          return selfclass(*args)  # this is a stub.

factory明らかに、これを価値のあるものにするために、子クラスは彼らにもっと関与する必要があります。factory適切なに置き換えることで解決できないユースケースがあるかどうかはわかりませんが__new__、これはより明確です。

于 2013-01-06T22:00:28.173 に答える