簡體   English   中英

從超類實例化子類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM