摘要:类对象不仅定义了实例的行为,还携带了大量的特殊属性,用于描述类的名称、继承关系、方法解析顺序、命名空间、类型注解、文档、弱引用支持、slots 限制等。
在 Python 中,类本身也是对象(具体来说,是 type 的实例)。
类对象不仅定义了实例的行为,还携带了大量的特殊属性,用于描述类的名称、继承关系、方法解析顺序、命名空间、类型注解、文档、弱引用支持、slots 限制等。
理解这些属性对于元编程、调试、框架设计非常重要。
cls.__name__
类的名称(字符串)。
class Animal: passprint(Animal.__name__) # Animalcls.__qualname__
类的完全限定名称,包含嵌套路径。
class Outer:class Inner: passprint(Outer.Inner.__qualname__) # Outer.Innercls.__module__
类定义所在的模块名。
import datetimeprint(datetime.date.__module__) # datetimecls.__doc__
类的文档字符串(docstring)。如果未定义,则为 None。
class Product:"""商品类"""passprint(Product.__doc__) # 商品类cls.__bases__
类的基类元组,顺序与定义时一致。
class A: passclass B(A): passprint(B.__bases__) #cls.__mro__
方法解析顺序(Method Resolution Order),在多重继承时确定属性查找路径。
class A: passclass B(A): passclass C(B): passprint(C.__mro__)#cls.__dict__
包含类属性与实例方法的字典(只读映射)。
注意:这里不会包含实例属性。
class Person:species = "human"def greet(self): return "hi"print(Person.__dict__["species"]) # humancls.__annotations__
类变量的类型注解字典。
class Point:x: inty: intprint(Point.__annotations__) # {'x': , 'y': }cls.__weakref__
允许类对象本身被弱引用。通常不直接操作,但框架可能会用到。
import weakrefclass A: passprint(hasattr(A, "__weakref__")) # Truecls.__slots__
在类中定义了 __slots__ 后,Python 不再为每个实例创建 __dict__,而是只允许实例拥有 __slots__ 指定的那些属性。
class User:__slots__ = ("name", "age") # 只允许这两个属性u = Useru.name = "Alice"u.age = 20print(u.name, u.age) # Alice 20u.address = "Beijing" # ❌ 报错:AttributeError注意:__slots__ 仅对实例生效,不影响类本身的 __dict__。
定义了 __slots__ 后,默认情况下实例没有 __dict__。想要保留 __dict__,可以在 __slots__ 里显式加 "__dict__"。
class User:__slots__ = ("name", "__dict__")u = Useru.name = "Alice"u.age = 20 # ✅ 现在可以动态加属性了print(u.__dict__) # {'age': 20}如果希望类的实例可以被弱引用,需要在 __slots__ 中加入 "__weakref__"。否则实例默认不能被弱引用。
小结
类对象的特殊属性大体可分为四类:
基本信息:__name__、__qualname__、__module__、__doc__
继承关系:__bases__、__mro__
命名空间与注释:__dict__、__annotations__
内存与限制:__weakref__、__slots__
这些属性揭示了类的定义位置、继承结构、方法解析规则、类型注解和内存优化机制。
在反射、自省、元编程、框架开发中,它们是理解和操作类对象的核心工具。
“点赞有美意,赞赏是鼓励”
来源:剧人之力