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中的保留关键字相同,以免出现问题。