2012-04-19 81 views
1

我想要做一些我认为很普通的面向对象编程 ,但找不到任何有关Python 2.7的文档 我想创建一个超类的子类, m完成 超类 绑定到超类 superclass.subclass绑定到子类并且 子类绑定到什么都没有。 这是我能拿出最好的解决办法:Python中的子类2.7

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

有时候我想子类是在它自己的文件,其他时间不。 有没有更优雅的解决方案,我不必手动执行最后两行 ? 虽然

class superclass: 
    class subclass: 
    pass 

几乎做正确的事,子类不真正从父继承。 如果我尝试做:

class superclass: 
    class subclass(superclass): 
    pass 

我收到一条错误消息,超绑定。

+6

你为什么想这样做?如果你不想在你的名字空间中使用'subclass',最好的方法是在一个模块中并且只导入'superclass'。 – agf 2012-04-19 05:29:49

+4

这与OOP无关,也许你正在从另一种语言移植想法,强迫这种歪曲 – 2012-04-19 05:34:34

回答

1

我同意其他人,这是做一个愚蠢的事情,我不认为你应该这样做,但在知识的兴趣:

class Superclass(object): 
    pass 

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

在字典参数包含任何方法。我不认为用class的语法可以做到这一点,但这只是用于调用type的语法糖。

您不必将方法定义为lambda s;只要它们具有self参数,它们就可以是def的正常函数。你可能想隐藏自己的定义,如果你这样做,虽然....

+0

这确实回答了这个问题,但如果整个问题的关键是保存行,那肯定会少得多...... – 2012-04-19 05:39:18

1

这里有一个简单的类装饰做参考:

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

这里是你如何使用它:

>>> class Superclass: 
     pass 

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

如果您不想在模块命名空间中使用该名称,则仍需要删除子类

+0

You '需要'setattr(cls .__ bases __ [0],cls .__ name__,cls)'将其分配给子类的名称;这会将其分配为字面名称“subclass”,因此仅适用于一个子类。 – Dougal 2012-04-21 20:35:33