1

我正在尝试做一些我认为在面向对象编程中非常普通的事情,但找不到任何关于 Python 2.7 的文档我想创建一个超类的子类,当我完成时,超类绑定到超类超类.subclass 绑定到子类,而 subclass 绑定到任何内容。这是我能想到的最佳解决方案:

class superclass:
  pass
class subclass(superclass):
  pass
superclass.subclass = subclass
del subclass

有时我希望子类在它自己的文件中,有时则不是。有没有更优雅的解决方案,我不必手动执行最后两行?虽然

class superclass:
  class subclass:
    pass

几乎做正确的事,子类实际上并没有从超类继承。如果我尝试这样做:

class superclass:
  class subclass(superclass):
    pass

我收到一条错误消息,指出超类未绑定。

4

2 回答 2

1

这是一个简单的类装饰器来进行引用:

def refer(cls):
    cls.__bases__[0].subclass = cls
    return cls

以下是你如何使用它:

>>> class Superclass:
        pass

>>> @refer
    class Subclass(SuperClass):
        pass

如果您不希望模块命名空间中的名称,您仍然需要删除Subclass 。

于 2012-04-19T06:11:12.697 回答
1

我同意其他所有人的观点,这是一件愚蠢的事情,我认为您不应该这样做,但是为了知识:

class Superclass(object):
    pass

Superclass.Subclass = type('Subclass', (Superclass,), {
    'foo': lambda self: self,
})

其中字典参数包含任何方法。我不认为有一个很好的方法可以用class语法来做到这一点,但这实际上只是调用的语法糖type

您不必将方法定义为lambdas; def只要它们有参数,它们就可以是普通函数self。但是,如果您这样做,您可能会想要隐藏它们的定义....

于 2012-04-19T05:37:21.357 回答