类的访问限制
要让内部属性或者方法不被外部访问,可以把在属性或者方法的名称前加上单下划线_, 或者在前面加双下划线__,或者两边加双下划线。
其中,在前面和后面都加双下划线的是系统的方法,比如 __init__() 方法。
在前面加一个下划线的表示保护类型的成员,对于这样的属性和方法,只允许类本身和子类可以访问。
例如:
class Swan:
"""天鹅类"""
_neck_swan = "天鹅的脖子很长" # 保护类型的属性
def __init__(self):
print("__init__(): ", Swan._neck_swan) # 访问保护类型的属性
swan = Swan() # 实例化Swan类的实例(对象)
print("直接访问:", swan._neck_swan) #通过实例名访问保护类型的属性
>>>
__init__(): 天鹅的脖子很长
直接访问: 天鹅的脖子很长
两个下划线开头的是私有类型的成员,可能是私有类型的属性或者方法,这样的方法只允许定义它的类本身可以访问,我们不能通过类的实例直接访问,但是可以通过 类的实例名._类名__xxx 访问。
例如:
class Swan:
"""天鹅类"""
__neck_swan = "天鹅的脖子很长" # 私有类型的属性
def __init__(self):
print("__init__(): ", Swan.__neck_swan) # 访问私有类型的属性
swan = Swan() # 实例化Swan类的实例(对象)
print("直接访问:", swan.__neck_swan) #通过实例名访问私有类型的属性
>>>
__init__(): 天鹅的脖子很长
Traceback (most recent call last):
File "C:/Users/XiangyangDai/Desktop/1.py", line 8, in <module>
print("直接访问:", swan.__neck_swan) #通过实例名访问私有类型的属性
AttributeError: 'Swan' object has no attribute '__neck_swan'
class Swan:
"""天鹅类"""
__neck_swan = "天鹅的脖子很长" # 私有类型的属性
def __init__(self):
print("__init__(): ", Swan.__neck_swan) # 访问私有类型的属性
swan = Swan() # 实例化Swan类的实例(对象)
print("间接访问:", swan._Swan__neck_swan) #通过实例名访问私有类型的属性
>>>
__init__(): 天鹅的脖子很长
间接访问: 天鹅的脖子很长