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

2024-03-29 09:06:49 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用类作用域初始化子类? 如何将父抽象类作用域传递给子类?在

我可以写这段代码,但每次调用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(),因为它将被重写?在

^{pr2}$

除了不具建设性的以外,任何帮助或暗示都是受欢迎的。在


Tags: of代码childreturnobjectdef子类作用域
1条回答
网友
1楼 · 发布于 2024-03-29 09:06:49

你不能。在

Python没有class声明。它有类定义。当您定义Parent2类时,缩进的代码是执行的。这意味着在其中定义的任何内部类都是在父类存在之前创建的。因此,不可能让Child2知道类范围内的Parent2。 注意,这与其他语言非常不同,比如Ruby,do允许在定义内引用类。在

还请注意,您的两个例子做了两件非常不同的事情。如果将类定义放在一个方法中,则每次调用该方法时都会创建一个新的类,而在类范围内这样做意味着只会创建一个类 在父范围内。在

我也相信你的设计是坏的。如果ChildParent严格相关,那么您要么使用继承,在这种情况下,您只需执行self.getParentName(),而不需要任何花哨的操作,要么就可以使用委派。在

如果你真的想这么做,那么你必须在父类被定义之后以某种方式“修复”这些类。为了做到这一点,你可以使用类修饰符,或者简单地将代码显式地放在父类之后。在

相关问题 更多 >