python - 继承父类

时间:2014-01-28 21:01:35

标签: python python-3.x

class A:
    class B(A):
        pass

这不起作用。为什么?我如何制作行为相同的东西?

我的意思是:

  • 相同的__class__.__name__
  • 相同的__class__.__qualname__
  • A.B.__base__ is A

3 个答案:

答案 0 :(得分:8)

不,不是没有解决方法。第一个类在其主体(包括class B(A)部分)执行时甚至不存在。你可以定义两个separtely:

class A:
    pass

class B(A):
    pass

A.B = B
B.__name__ = ...
B.__qualname__ = ...

但老实说,这看起来不像是最好的设计或API。

答案 1 :(得分:1)

评估发生在“由内而外”。在之后在其类主体中的所有内容完成之后,才会创建A类。因此,在定义B时,A尚不存在。

你唯一的选择是用一些其他基类定义类B,然后在A上编写一个类装饰器或元类,它在A中查找具有指定“虚拟”基类的类的属性,并使用A重新创建它们。他们的基地。

真正的问题是为什么你觉得你需要这样做。

答案 2 :(得分:0)

仅仅因为元类很有趣:

class GoofyMeta(type):
    def __new__(cls, clsname, bases, dct):
        dct['__qualname__'] = bases[0].__qualname__
        return super(GoofyMeta, cls).__new__(cls, bases[0].__name__, bases, dct)

class A:
    pass

#using python 3 syntax here
class B(A,metaclass=GoofyMeta):
    pass

B.__name__
Out[24]: 'A'

B.__qualname__
Out[25]: 'A'

根据定义,B.__base__A

至于你为什么要这样,我很神秘。看起来你可以像我们其他人一样使用继承/组合: - )

(我还要注意,我没有解决B以某种方式成为A的内部类。我额外加一个不知道你是什么重新尝试。)