class A:
class B(A):
pass
这不起作用。为什么?我如何制作行为相同的东西?
我的意思是:
__class__.__name__
__class__.__qualname__
A.B.__base__ is A
答案 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
的内部类。我额外加一个不知道你是什么重新尝试。)