1 需求
2 接口
3 示例
4 参考资料
在 Python 中,像 __name__
这样的双下划线属性(也称为 "dunder" 属性,即 "double underscore" 的缩写)是 Python 的特殊属性或方法,它们为类、对象或模块提供了特殊的行为或元数据。以下是一些常见的类似 __name__
的特殊属性和方法:
1. 模块级特殊属性
这些属性通常在模块层级使用,提供关于模块的元信息:
-
__name__
当前模块的名称。如果是主程序,则值为'__main__'
;如果是被导入的模块,则为模块名。if __name__ == '__main__': print("作为主程序运行") else: print(f"被导入为模块: {__name__}")
-
__file__
当前模块的文件路径(如果是脚本),或编译后的字节码文件路径(如.pyc
文件)。print(f"模块文件路径: {__file__}")
-
__doc__
模块、类或函数的文档字符串(docstring)。def add(a, b): """返回两个数的和""" return a + b print(add.__doc__) # 输出: "返回两个数的和"
-
__package__
当前模块所属的包名称(用于包内相对导入)。print(f"模块所属包: {__package__}")
-
__loader__
加载当前模块的加载器对象。print(f"模块加载器: {__loader__}")
2. 类和对象的特殊属性
这些属性用于类和对象的底层行为:
-
__class__
对象所属的类。num = 42 print(num.__class__) # 输出: <class 'int'>
-
__dict__
类或对象的属性字典,包含所有可写的属性。class Person: def __init__(self, name): self.name = name p = Person("Alice") print(p.__dict__) # 输出: {'name': 'Alice'}
-
__bases__
类的基类元组,用于查看继承关系。class Animal: pass class Dog(Animal): pass print(Dog.__bases__) # 输出: (<class '__main__.Animal'>,)
-
__mro__
类的方法解析顺序(Method Resolution Order),用于多重继承时确定方法调用路径。class A: pass class B(A): pass class C(B): pass print(C.__mro__) # 输出: (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
3. 特殊方法(Magic Methods)
这些双下划线方法用于实现对象的特殊行为,如运算符重载、迭代等:
-
__init__(self, ...)
对象的初始化方法,在创建对象时自动调用。class Point: def __init__(self, x, y): self.x = x self.y = y
-
__str__(self)
对象的字符串表示,用于print()
和str()
函数。class Point: def __str__(self): return f"Point({self.x}, {self.y})"
-
__len__(self)
对象的长度,用于len()
函数。class MyList: def __init__(self, data): self.data = data def __len__(self): return len(self.data)
-
__getitem__(self, key)
实现对象的索引访问(如obj[key]
)。class MyList: def __getitem__(self, index): return self.data[index]
-
__call__(self, ...)
使对象可以像函数一样被调用。class Adder: def __call__(self, a, b): return a + b add = Adder() print(add(3, 4)) # 输出: 7
4. 其他特殊属性
-
__slots__
限制类实例可以添加的属性,节省内存。class Person: __slots__ = ['name', 'age'] # 只允许添加 'name' 和 'age' 属性
-
__all__
模块中使用from module import *
时要导入的对象列表(需显式定义)。__all__ = ['func1', 'Class1'] # 只导出 func1 和 Class1
-
__version__
模块或包的版本号(通常由开发者自定义)。__version__ = '1.0.0'
如何查看对象的所有特殊属性?
使用 dir()
函数可以获取对象的所有属性和方法,包括特殊属性。过滤出双下划线开头和结尾的属性即可:
def get_special_attrs(obj):
return [attr for attr in dir(obj) if attr.startswith('__') and attr.endswith('__')]
# 查看模块的特殊属性
import sys
print(get_special_attrs(sys))
# 查看类的特殊属性
class MyClass: pass
print(get_special_attrs(MyClass))
# 查看对象的特殊属性
obj = MyClass()
print(get_special_attrs(obj))
注意事项
- 不要随意修改特殊属性:这些属性是 Python 的底层机制,修改它们可能导致意外行为。
- 按需实现特殊方法:特殊方法(如
__str__
)用于增强对象的行为,但需谨慎使用。 - 避免与特殊属性重名:自定义属性和方法应避免使用双下划线开头和结尾的名称,以免与 Python 的特殊机制冲突。
通过了解这些特殊属性和方法,可以更深入地理解 Python 的运行机制,并编写出更具 Python 风格的代码。