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

如果您不能只调用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 回答