繁体   English   中英

父类 self.__class__.__name__ 打印子类的名称

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM