[英]parent class self.__class__.__name__ prints name of child class
我有 2 个班级:a 和 b。 'b' 继承自 'a'。 我如何让“a”类打印它的实际名称? 在下面的情况下,它打印子类的名称。
class a():
def __init__(self):
print("a -> " + self.__class__.__name__)
class b(a):
def __init__(self):
super().__init__()
print("b -> " + self.__class__.__name__)
bo = b()
印刷:
a -> b
b -> b
您可以使用在类块中定义的所有方法中可用的__class__
变量(而不是属性)。 所以:
In [1]: class a():
...: def __init__(self):
...: print("a -> " + __class__.__name__)
...:
...: class b(a):
...: def __init__(self):
...: super().__init__()
...: print("b -> " + __class__.__name__)
...:
...:
In [2]: b()
a -> a
b -> b
Out[2]: <__main__.b at 0x10ce853a0>
这是 Python 数据模型的一部分,添加它是为了允许在 Python 3 中可用的super()
的无参数形式。
如果类体中的任何方法引用
__class__
或super
则__class__
是由编译器创建的隐式闭包引用。 这允许super()
的零参数形式根据词法范围正确识别正在定义的类,而用于进行当前调用的类或实例是根据传递给方法的第一个参数来识别的。
所以请注意,这不适用于动态添加的方法:
In [4]: a.a_method = a_method
In [5]: b().a_method()
a -> a
b -> b
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-5887c7d36b49> in <module>
----> 1 b().a_method()
<ipython-input-3-daf632bde4e5> in a_method(self)
1 def a_method(self):
----> 2 print(__class__)
3
NameError: name '__class__' is not defined
问题是当您创建bo
,它被初始化为类型b
的对象。 这意味着对于bo
,无论是在a
类还是b
类中使用的self
变量,都将是b
类型。
一种替代方法是在类本身而不是self
上调用.__name__
:
class a():
def __init__(self):
print("a -> " + a.__name__)
class b(a):
def __init__(self):
super().__init__()
print("b -> " + b.__name__)
bo = b()
>>> a -> a
>>> b -> b
但是,此时,您不妨对打印语句进行硬编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.