我试图在一些python代码中执行以下操作:
class Parent:
class Child(Parent):
pass
它不起作用。我可以使用任何python语法来实现相同的结果吗?
感谢。
答案 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'>)