python类私有函数的使用方法

  • Post category:Python

Python中,可以使用“_”或“”作为类的私有方法或变量的前缀,它们都具有封装性,可以限制外部类或模块的访问。其中以双下划线“”作为前缀的方法或变量被Python解释器强制更名为“_类名__变量名”、“_类名__方法名”的形式,从而实现了更安全的封装机制。

一般认为双下划线作为前缀的变量和方法是私有的,其实它们只是被解释器更名了,而本质上在类内部使用时,还是用原来的名称,也可以在类外使用“_类名__方法名”、“_类名__变量名”的形式来访问。下面是一个使用双下划线封装的例子:

class Student():
    def __init__(self, name, gender):
        self.__name = name
        self.__gender = gender

    def get_name(self):
        return self.__name

    def get_gender(self):
        return self.__gender

    def set_gender(self, gender):
        if gender == 'male' or gender == 'female':
            self.__gender = gender
        else:
            raise ValueError('bad gender')

s = Student('Bob', 'male')
print(s.get_name())               # Bob
print(s.get_gender())             # male
s.set_gender('female')
print(s.get_gender())             # female

可以看到,在这个例子中,我们使用了双下划线将学生的姓名和性别都隐藏起来,并提供了访问这些属性的方法,同时提供了设置性别的方法并做了判断。类外访问这些属性时,需要使用封装的方法。

除了使用双下划线以外,还可以使用单下划线封装属性和方法。使用单下划线作为前缀的属性和方法,虽然不属于Python中真正的私有属性和方法,但是它的意义是作为一种约束,告诉客户代码不应该直接访问该属性或方法。

下面是一个使用单下划线封装的例子:

class Car():
    def __init__(self, name, color):
        self._name = name
        self._color = color

    def _show_info(self):
        print('Car name:', self._name)
        print('Car color:', self._color)

class Honda(Car):
    def __init__(self, name, color):
        super().__init__(name, color)

    def show_info(self):
        self._show_info()

h = Honda('civic', 'red')
h.show_info()

这个例子中,我们使用了单下划线将汽车的名称和颜色都隐藏起来,并提供了一个展示汽车信息的方法。子类Honda可以使用这个方法来展示车辆信息,但是在客户代码中,不应该直接访问这些属性或方法,而是通过相关的方法来操作。

总而言之,在Python中,使用双下划线或单下划线作为前缀,都可以达到一定的封装性,同时还要注意方法和属性的名称不能与Python中的保留关键字相同,以免出现问题。