📅  最后修改于: 2023-12-03 14:46:42.258000             🧑  作者: Mango
魔杖线函数(underscore)是Python中一个比较特别的函数,它经常用来表示一个变量或者方法是私有的,也就是说只有在类的内部才能够被访问。
那么魔杖线函数的具体应用有哪些呢?
在Python中,有一种方法可以创建私有变量,使用魔杖线作为变量名的前缀。被命名为私有变量的变量只能在类的内部访问:
class MyClass:
def __init__(self):
self.__private_var = 10
def print_private_var(self):
print(self.__private_var)
obj = MyClass()
obj.print_private_var() # 输出 10
print(obj.__private_var) # AttributeError: 'MyClass' object has no attribute '__private_var'
在上面的代码中,我们用魔杖线函数给变量private_var
命名,这意味着它只能在类的内部被访问。在类外部访问私有的变量会导致AttributeError。
除了可以用魔杖线函数来命名私有变量之外,我们还可以用它来命名私有方法。私有方法也只能在类的内部访问,不能在类的外部调用:
class MyClass:
def __init__(self):
self.__private_var = 10
def __private_method(self):
print("Private method called")
def public_method(self):
self.__private_method()
obj = MyClass()
obj.public_method() # 输出 "Private method called"
obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method'
在上面的代码中,我们用魔杖线函数给方法private_method
命名,这样它就成为了私有方法,只能在类的内部被访问。
Python中的私有变量和方法虽然只能在类的内部访问,但是子类仍然无法覆盖父类的私有变量和方法,也就是说不能重写(override)父类的私有成员。
同时,Python也没有真正的私有化机制,所以如果 really want to 访问父类的私有变量和方法,你真的可以使用以下格式:
class MyDerivedClass(MyClass):
def var_print(self):
print(self.__private_var) # AttributeError: 'MyDerivedClass' object has no attribute '_MyDerivedClass__private_var'
print(self._MyClass__private_var) # 输出 10
def method_call(self):
self.__private_method() # AttributeError: 'MyDerivedClass' object has no attribute '_MyDerivedClass__private_method'
self._MyClass__private_method() # 输出 "Private method called"
在上面的代码中,我们创建了一个继承自MyClass的MyDerivedClass类。在这个类中,我们尝试访问父类的私有变量和方法,通过使用“_类名__私有成员”这一格式,我们仍然可以访问它们。
魔杖线函数是Python中的一个非常有用的特性,在一个变量或方法名称之前添加一个下划线即可使它变成私有的,只能在类的内部访问,不能从类的外部进行访问。同时,Python中没有真正的私有机制,使用“_类名__私有成员”这一方法可以访问父类中的“私有”成员。