自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
在类的内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏了类内部的复杂逻辑。但是Python并没有对属性和方法的访问权限进行限制。为了保证类内部的某些属性或方法不被外部所访问,可以在属性或方法名前面添加单下划线(_foo)、双下划线(__foo)或首尾加双下划线(__foo__),从而限制访问权限。其中,单下划线、双下划线、首尾双下划线的作用如下:
(1)首尾双下划线表示定义特殊方法,一般是系统定义名字,如__init__()。
(2)以单下划线开头的表示protected(保护)类型的成员,只允许类本身和子类进行访问,但不能使用“from module import *”语句导入。
例如,创建一个Swan类,定义保护属性_neck_swan,并使用__init__()方法访问该属性,然后创建Swan类的实例,并通过实例名输出保护属性_neck_swan,代码如下:
class Swan:
'''天鹅类'''
_neck_swan = '天鹅的脖子很长' # 定义保护属性
def __init__(self):
print("__init__():", Swan._neck_swan) # 在实例方法中访问保护属性
swan = Swan() # 创建Swan类的实例
print("直接访问:" , swan._neck_swan) # 保护属性可以通过实例名访问
执行下面的代码,将显示以下内容:
__init__(): 天鹅的脖子很长
直接访问: 天鹅的脖子很长
从上面的运行结果中可以看出,保护属性可以通过实例名访问。
(3)双下划线表示private(私有)类型的成员,只允许定义该方法的类本身进行访问,而且也不能通过类的实例进行访问,但是可以通过“类的实例名._类名__xxx”方式访问。
例如,创建一个Swan类,定义私有属性__neck_swan,并使用__init__()方法访问该属性,然后创建Swan类的实例,并通过实例名输出私有属性__neck_swan,代码如下:
class Swan:
'''天鹅类'''
__neck_swan = '天鹅的脖子很长' # 定义私有属性
def __init__(self):
print("__init__():", Swan.__neck_swan) # 在实例方法中访问私有属性
swan = Swan() # 创建Swan类的实例
print("加入类名:" , swan._Swan__neck_swan) # 私有属性,可以通过“实例名._类名__xxx”方式访问
print("直接访问:" , swan.__neck_swan) # 私有属性不能通过实例名访问,出错
执行上面的代码后,将输出如图13所示的结果。
图13 访问私有属性
从上面的运行结果可以看出:私有属性不能直接通过实例名+属性名访问,可以在类的实例方法中访问,也可以通过“实例名._类名__xxx”方式访问。