python类的内置属性
在 Python 中,类(以及类的实例)具有一些内置属性(也称为“特殊属性”或“魔法属性”),它们由 Python 解释器自动提供,用于获取类的元信息或控制类的行为。这些属性通常以双下划线 __
开头和结尾(部分属性如 __dict__
、__module__
等例外)。
以下是 Python 类中常见的内置属性及其功能说明:
1. __dict__
- 作用:存储类或实例的属性字典(可读写)。
- 说明:
- 类的
__dict__
存储类属性和方法。 - 实例的
__dict__
存储实例属性。
- 类的
- 示例:
class MyClass:class_attr = "I am a class attribute" #类属性def __init__(self, value):self.instance_attr = value #实例的属性 obj = MyClass(42) print(MyClass.__dict__) # 包含类属性和方法 print(obj.__dict__) # 包含实例属性 #没有self的是类属性,有self的实例属性
2. __module__
- 作用:返回类定义所在的模块名。
- 示例:
# 文件: my_module.py class MyClass:pass # 在其他文件中导入 from my_module import MyClass print(MyClass.__module__) # 输出: 'my_module'
3. __name__
- 作用:返回类的名称(字符串形式)。
- 示例:
class MyClass:pass print(MyClass.__name__) # 输出: 'MyClass'
4. __bases__
- 作用:返回类的直接父类组成的元组(按继承顺序)。
- 示例:
class Parent1: pass class Parent2: pass class Child(Parent1, Parent2): pass print(Child.__bases__) # 输出: (<class '__main__.Parent1'>, <class '__main__.Parent2'>)
5. __doc__
文档字符串(docstring)是 Python 中一种特殊的字符串,用来描述模块、类、函数或方法的用途和行为。它必须符合以下两个条件:
位置:必须是定义体(类、函数、模块)的第一个语句。
格式:必须是三引号字符串(单引号或双引号均可,但推荐双引号 “”")。
- 作用:返回类的文档字符串(docstring),如果没有定义则为
None
。 - 示例:
class MyClass:"""This is a class docstring."""pass print(MyClass.__doc__) # 输出: 'This is a class docstring.'
6. __annotations__
- 作用:返回类中变量和方法的类型注解字典(Python 3.6+)。
- 示例:
class MyClass:x: inty: str = "hello"def method(self, a: float) -> bool:return True print(MyClass.__annotations__) # 输出: {'x': <class 'int'>, 'y': <class 'str'>}
7. __class__
- 作用:返回实例所属的类(或类自身的类型,即
type
)。 - 示例:
class MyClass: pass obj = MyClass() print(obj.__class__) # 输出: <class '__main__.MyClass'> print(MyClass.__class__) # 输出: <class 'type'>
8. __subclasses__()
- 作用:返回类的所有直接子类列表(注意:这是方法而非属性)。
- 示例:
class Parent: pass class Child1(Parent): pass class Child2(Parent): pass print(Parent.__subclasses__()) # 输出: [<class '__main__.Child1'>, <class '__main__.Child2'>]
9. __mro__
- 作用:返回类的**方法解析顺序(Method Resolution Order, MRO)**元组,用于多重继承时确定方法调用顺序。
- 示例:
class A: pass class B(A): pass class C(A): pass class D(B, C): pass print(D.__mro__) # 输出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
10. __qualname__
- 作用:返回类的限定名称(包含嵌套类的路径)。
- 示例:
class Outer:class Inner:pass print(Outer.Inner.__qualname__) # 输出: 'Outer.Inner'
总结表
属性/方法 | 作用 |
---|---|
__dict__ | 类或实例的属性字典 |
__module__ | 类定义所在的模块名 |
__name__ | 类的名称 |
__bases__ | 直接父类元组 |
__doc__ | 类的文档字符串 |
__annotations__ | 类型注解字典 |
__class__ | 实例所属的类(或类的类型) |
__subclasses__() | 返回所有直接子类(方法) |
__mro__ | 方法解析顺序(MRO)元组 |
__qualname__ | 类的限定名称(包含嵌套路径) |
注意事项
- 可读性 vs 修改性:
- 大部分内置属性(如
__name__
、__bases__
)是只读的,但__dict__
和__annotations__
可以动态修改。
- 大部分内置属性(如
- 与特殊方法的区别:
- 内置属性(如
__name__
)存储元信息,而特殊方法(如__init__
、__str__
)定义类的行为。
- 内置属性(如
- 动态性:
- Python 的类和对象是动态的,可以通过
__dict__
或setattr
/getattr
动态操作属性。
如果你需要更深入地了解某个属性的使用场景或底层实现,可以继续提问!
- Python 的类和对象是动态的,可以通过