在 Python 中,以双下划线开头和结尾的属性和方法被称为特殊成员(或“魔术方法”),它们在类和模块中具有特定用途。以下是 __init__
、__dict__
、__name__
和 __main__
的详细解释及示例:
1. __init__
:构造函数
- 作用:用于初始化类的实例对象,在创建对象时自动调用。
- 特点:
- 不是真正的构造函数(实际构造函数是
__new__
),但常用作初始化逻辑。 - 第一个参数必须是
self
(表示实例本身),后续参数可自定义。
- 不是真正的构造函数(实际构造函数是
- 示例:
class User: def __init__(self, name, age): self.name = name self.age = age user = User("Alice", 25) print(user.name) # 输出: Alice
2. __dict__
:属性字典
- 作用:存储对象或类的所有可写属性,以字典形式返回。
- 适用场景:
- 查看实例或类的属性和方法。
- 动态添加或修改属性。
- 示例:
class User: def __init__(self, name): self.name = name user = User("Bob") # 查看实例属性 print(user.__dict__) # 输出: {'name': 'Bob'} # 动态添加属性 user.__dict__["age"] = 30 print(user.age) # 输出: 30
3. __name__
:名称属性
- 作用:获取对象(模块、类、函数等)的名称。
- 常见用法:
- 模块:若模块被直接运行,
__name__
为'__main__'
;若被导入,则为模块名。 - 类/函数:返回定义时的名称。
- 模块:若模块被直接运行,
- 示例:
# 文件名为 my_module.py def my_func(): pass class MyClass: pass print("模块名:", __name__) # 直接运行时输出: __main__ print("函数名:", my_func.__name__) # 输出: my_func print("类名:", MyClass.__name__) # 输出: MyClass
4. __main__
:主模块标识
- 作用:表示当前脚本是主程序入口(而非被导入的模块)。
- 典型用法:用
if __name__ == '__main__':
区分模块是被导入还是直接运行。 - 示例:
# 文件名为 app.py def main(): print("程序启动") if __name__ == '__main__': main() # 直接运行 app.py 时执行
- 直接运行
app.py
会执行main()
。 - 导入
app
模块时,main()
不会自动执行。
- 直接运行
总结表格
特殊成员 | 用途 | 常见场景 |
---|---|---|
__init__ | 初始化对象属性 | 类的构造函数 |
__dict__ | 查看或动态操作对象的属性字典 | 调试、动态编程 |
__name__ | 获取模块/类/函数的名称 | 模块执行判断、反射 |
__main__ | 标识当前模块为主程序入口 | 代码入口保护(if __name__... ) |
进阶用法
1. __dict__
与动态属性
可以通过修改 __dict__
动态添加或删除属性:
user = User("Charlie")
user.__dict__["email"] = "charlie@example.com"
del user.__dict__["name"]
print(user.email) # 输出: charlie@example.com
2. __name__
用于反射
通过类名动态创建实例:
class Dog:
pass
class Cat:
pass
# 根据字符串类名创建对象
class_name = "Dog"
animal = globals()[class_name]()
print(type(animal)) # 输出: <class '__main__.Dog'>
掌握这些特殊成员,能更灵活地控制 Python 对象和模块的行为!