如何使用使用类范围初始化子类? 如何将父抽象类范围传递给子类?
我可以编写这段代码但是每次调用getChild我都会创建一个类但是要避免:
class Parent(object): # abstract class!
@staticmethod
def getParentName():
raise NotImplementedError()
@classmethod
def getChild(cls): # solid class
class Child(object):
@staticmethod
def getChildName():
return 'Child of ' + cls.getParentName()
return Child
class SomeParent(Parent):
@staticmethod
def getParentName():
return 'Solid Parent'
print SomeParent.getChild().getChildName() # == 'Child of Solid Parent'
如何将上面的代码转换为父范围中的定义子类(认为父类是抽象的,所以我们不能使用Parent2.getParentName(),因为它将被覆盖?
class Parent2(object): # abstract class!
@staticmethod
def getParentName()
raise NotImplementedError()
class Child2(object): # solid class
# what code here to do the same like Child???
pass
class SomeParent2(Parent): # final class
@staticmethod
def getParentName()
return 'Solid Parent2'
SomeParent2.getChildClass().getChildName() # == 'Child of Solid Parent2'
除了没有建设性的东西之外,任何帮助或提示都会受到欢迎。
答案 0 :(得分:1)
你不能。
Python 不具有类声明。它有类定义。定义Parent2
类时,缩进代码已执行。这意味着在父级存在之前创建的就是在那里定义的任何内部类。因此,{em>不可能让Child2
了解类范围内的Parent2
。
请注意,这与其他语言非常不同,例如Ruby do 允许引用定义中的类。
另请注意,您的两个示例会执行两个非常不同的操作。如果将类定义放在一个方法中,每次调用方法时都会创建一个 new 类,而在类范围内这样做意味着只有一个类将被创造 在父范围内。
另外我相信你的设计已被打破。如果Child
与Parent
严格相关,那么您应该使用继承,在这种情况下,您只需执行self.getParentName()
,没有任何幻想,或者您可以使用委托。
如果你真的想做那件事,那么你必须以某种方式“修复”定义父类后的类。为此,您可以使用类装饰器,或者只是将代码显式放在父类之后。