一、名称修饰(Name Mangling)
在Python中,当你在一个类中定义一个方法,其名称以两个下划线 __
开头但不以两个下划线结尾时(例如:__private_method
),Python会对这个方法名进行名称修饰。名称修饰的实际效果是,该方法在类外部不能直接以其原始名称访问,而是被改写为 _ClassName__private_method
这样的形式。这种特性并不是为了创建真正的私有成员,而更多的是为了避免子类无意中覆盖父类的内部实现细节。然而,通过类的内部机制,还是可以访问到这些方法的。
例如:
class MyClass:def __private_method(self):print("This is a 'private' method.")# 直接访问会出错
# my_class = MyClass()
# my_class.__private_method()# 但实际上,仍可以通过名称修饰后的名称访问
my_class = MyClass()
my_class._MyClass__private_method() # 输出: This is a 'private' method.
二、特殊方法(Magic Methods 或 Dunder Methods)
以双下划线前后各有两个下划线的方法,如 __init__
, __str__
, __eq__
等,它们在Python中被称为特殊方法或者魔术方法。这些方法在特定的上下文环境中会自动调用,用来实现对象的核心功能和行为。
例如:
class Person:def __init__(self, name):self.name = namedef __str__(self):return f"Person object: {self.name}"p = Person("Alice")
print(p) # 自动调用 __str__ 方法,输出:Person object: Alice
在这个例子中,__init__
是构造方法,在创建Person对象时被调用;__str__
方法则返回一个便于阅读的对象表示,当尝试打印对象或将其转换为字符串时会调用它。
三、系统定义的名字
某些以双下划线开头和结尾的名称,如 __file__
, __name__
, __doc__
等,是Python中预定义的特殊属性,它们与模块或类的元信息相关,不由用户自定义,而是由Python解释器自动提供。
例如:
import sys# 获取当前模块的文件路径
print(sys.modules[__name__].__file__) # 输出当前执行文件的路径# 获取模块/类的文档字符串
class MyClass:"""这是一个示例类"""print(MyClass.__doc__) # 输出:这是一个示例类