Python:我如何将我嵌套的类子类化?

时间:2010-05-22 21:00:04

标签: python

我试图在一些python代码中执行以下操作:

class Parent:
    class Child(Parent):
        pass

它不起作用。我可以使用任何python语法来实现相同的结果吗?

感谢。

3 个答案:

答案 0 :(得分:4)

您不能这样做,因为在定义Child时,Parent尚未定义(正在进行定义)。嵌套类通常不在Python中使用,您可以在同一模块中声明不同的类。但是,如果您绝对需要实现概述设置,则可以执行以下操作:

class Parent: pass
class Child (Parent): pass

Parent.Child = Child
del Child

答案 1 :(得分:1)

内部类与Python中的外部类没有特殊关系,因此没有理由使用它们。另外,将类作为另一个类的类属性通常不是最佳设计。通过重组一点,我打赌你可以提出一个不需要或不需要这种行为的解决方案,而且这种解决方案更好,更具惯用性。

答案 2 :(得分:0)

我强烈建议不要做以下任何事情;我真的没有任何理由去做,而且过于复杂。但出于教育目的......

在创建封闭(Parent)类之后,可能有一个元类(或类装饰器,我想)用实际的子类替换来自类定义的一些对象。

例如,在下文中,我们检查每个类属性的ReplaceMe属性中是否存在特殊标记(一个名为__bases__的类)。如果我们找到它,我们假设我们发现的东西是应该是一个子类的立场。我们动态创建一个新的(子)类,用自己替换ReplaceMe类。

class ReplaceMe(object): pass

class DerivedInnerChildren(type):
    def __init__(cls, name, bases, attrs):
        for k, v in attrs.items():
            if ReplaceMe in getattr(v, '__bases__', ()):
                child_name = v.__name__
                child_bases = tuple([
                    base if base is not ReplaceMe else cls
                    for base in v.__bases__])
                child_attrs = dict(v.__dict__)
                setattr(cls, k, type(child_name, child_bases, child_attrs))

class Parent(object):
    __metaclass__ = DerivedInnerChildren
    class Child(ReplaceMe): 
        pass

print Parent
print Parent.Child
print 'Parent in Child mro?', Parent in Parent.Child.__mro__
print Parent.Child.__mro__

打印:

<class '__main__.Parent'>
<class '__main__.Child'>
Parent in Child mro? True
(<class '__main__.Child'>, <class '__main__.Parent'>, <type 'object'>)