类定义阶段如何访问内置类属性?含__doc__等双下划线属性疑问
类定义阶段访问内置属性的常见问题解答
嘿,咱们一步步拆解你的问题,帮你搞清楚类定义过程中这些属性的访问逻辑:
1. 如何在类定义阶段的类体中访问内置类属性?
在Python中,类定义的过程是这样的:Python会先执行类体中的代码,把所有变量、函数存入一个临时命名空间,然后由元类(默认是type)用这个命名空间创建出类对象。所以在类体执行时,完整的类对象还没被创建,但有些内置属性可以通过临时命名空间或者模块级别的变量间接获取:
- doc:类体中的第一个字符串字面量会被自动存入当前命名空间的
__doc__变量,你可以直接访问它:class MyClass: """这是我的类文档""" # 在类定义阶段获取__doc__ captured_doc = __doc__ print(MyClass.captured_doc) # 输出: 这是我的类文档 - module:类的
__module__默认等于定义它的模块名,所以你可以直接用模块的__name__获取:class MyClass: module_name = __name__ print(MyClass.module_name) # 输出: __main__(如果在主模块运行) - 无法直接访问的属性:像
__name__(类名)、__bases__(基类元组)、__dict__(类的属性字典)这些,因为它们是元类创建类对象时才绑定的,类体执行时还不存在。不过你可以通过间接方式模拟:class Parent: pass class MyClass(Parent): # 手动指定基类,和后续的__bases__一致 captured_bases = (Parent,) # 用locals()查看当前类体的临时命名空间 captured_namespace = locals().copy() print(MyClass.__bases__ == MyClass.captured_bases) # 输出: True
2. 类定义过程中能否访问__doc__?其他双下划线属性怎么处理?
关于__doc__的访问
完全可以访问!刚才的例子已经验证了这一点——Python在执行类体时,会把第一个字符串字面量临时存入当前命名空间的__doc__变量,元类只是在类对象创建时,把这个值转移到类的__doc__属性中,并不是等到类体执行完才赋值。
__doc__的别名
Python没有给__doc__内置别名,但你可以自己给类添加一个别名属性,比如:
class MyClass: """这是文档""" doc = __doc__ # 自定义别名 print(MyClass.doc == MyClass.__doc__) # 输出: True
其他双下划线属性/方法的处理
分两种情况来看:
- 类对象的内置属性(如
__name__、__bases__、__mro__):这些是类对象创建后才有的属性,类定义阶段无法直接访问,必须等类完全定义完成后才能调用。 - 类中定义的双下划线方法(如
__init__、__str__):这些是你在类体中定义的函数,属于临时命名空间的一部分,所以在类定义阶段可以直接访问甚至修改:class MyClass: def __init__(self): pass # 在类定义阶段访问__init__方法 init_method = __init__ print(MyClass.init_method is MyClass.__init__) # 输出: True
内容的提问来源于stack exchange,提问作者polwel
相关产品推荐
相关产品推荐

