如何使用类范围初始化/定义子类而不是类方法范围?

时间:2013-10-15 15:16:47

标签: python python-2.7 abstract-class

如何使用使用类范围初始化子类? 如何将父抽象类范围传递给子类?

我可以编写这段代码但是每次调用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'

除了没有建设性的东西之外,任何帮助或提示都会受到欢迎。

1 个答案:

答案 0 :(得分:1)

你不能

Python 具有类声明。它有类定义。定义Parent2类时,缩进代码已执行。这意味着在父级存在之前创建的就是在那里定义的任何内部类。因此,{em>不可能让Child2了解类范围内的Parent2。 请注意,这与其他语言非常不同,例如Ruby do 允许引用定义中的类。

另请注意,您的两个示例会执行两个非常不同的操作。如果将类定义放在一个方法中,每次调用方法时都会创建一个 new 类,而在类范围内这样做意味着只有一个类将被创造 在父范围内。

另外我相信你的设计已被打破。如果ChildParent严格相关,那么您应该使用继承,在这种情况下,您只需执行self.getParentName(),没有任何幻想,或者您可以使用委托。

如果你真的想做那件事,那么你必须以某种方式“修复”定义父类后的类。为此,您可以使用类装饰器,或者只是将代码显式放在父类之后。