面试题答案
一键面试在Python中,通过在属性名前添加单下划线 _
表示该属性为“受保护的”,理论上只应该在类内部或子类中访问;添加双下划线 __
表示该属性为“私有”,会进行名称改写,使得在类外部无法直接访问。
示例代码如下:
class MyClass:
def __init__(self):
self.public_attr = "这是一个公共属性,可以在类外部访问"
self._protected_attr = "这是一个受保护属性,理论上应在类内部或子类中访问"
self.__private_attr = "这是一个私有属性,在类外部无法直接访问"
def get_private_attr(self):
return self.__private_attr
obj = MyClass()
print(obj.public_attr)
# 虽然理论上不应该在类外部访问受保护属性,但实际上还是可以访问的
print(obj._protected_attr)
# 下面这行代码会报错,无法直接访问私有属性
# print(obj.__private_attr)
# 可以通过类内部的方法来获取私有属性的值
print(obj.get_private_attr())
这种访问控制机制的原理:
- 公共属性:没有任何特殊前缀,在类内部和外部都能自由访问。
- 受保护属性:添加单下划线
_
,这只是一种约定俗成的规范,提醒开发者此属性最好在类内部或子类中使用,但实际上在类外部仍可访问。 - 私有属性:添加双下划线
__
,Python会对其进行名称改写,将属性名变为_类名__属性名
的形式,这样在类外部就无法通过原来的属性名直接访问,从而实现一定程度的“私有”效果。