[英]Instantiate subclass from superclass
我需要从超类中实例化一个子类。
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也是如此
使用@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
如果要访问给定类的子类列表,可以使用__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>
无论如何,我猜你正在尝试实现Singleton模式,在这种情况下我认为你根本不应该使用getInstance
方法。 只需实现它:
__new__
以返回旧实例 还有很多方法可以做到这一点。
如果这不是你的目标,那么也许你应该改变设计,因为超类通常不必了解子类。
如果你不能在类方法中调用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
更多地参与其中以使其有价值。 我不确定是否有任何用例通过用适当的__new__
替换factory
__new__
,但这更明确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.