📜  Python中的魔杖线()函数(1)

📅  最后修改于: 2023-12-03 14:46:42.258000             🧑  作者: Mango

Python中的魔杖线()函数

魔杖线函数(underscore)是Python中一个比较特别的函数,它经常用来表示一个变量或者方法是私有的,也就是说只有在类的内部才能够被访问。

那么魔杖线函数的具体应用有哪些呢?

1. 私有变量的命名

在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。

2. 私有方法的命名

除了可以用魔杖线函数来命名私有变量之外,我们还可以用它来命名私有方法。私有方法也只能在类的内部访问,不能在类的外部调用:

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命名,这样它就成为了私有方法,只能在类的内部被访问。

3. 子类无法覆盖父类的私有变量和方法

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中没有真正的私有机制,使用“_类名__私有成员”这一方法可以访问父类中的“私有”成员。