Python3 类访问控制
在类的内部,我们定义属性和方法,在类外部代码通过调用实例变量的方法来操作数据,这样就隐藏了类内部的实现逻辑。
如果我们定义属性和方法没有加访问控制,外部代码还是能自由地修改一个实例的属性。
Python中没有其它语言那样的用于访问控制的关键字,例如private、protected等。
但是,在Python中,有一些约定来进行访问控制。
“_”和” __”的使用 更多的是一种规范/约定,没有任何机制来限制,即没有真正达到限制的目的。
“单下划线_”:以单下划线开头的表示的是protected类型的变量,即只能允许其本身与子类进行访问,
同时表示弱内部变量标示,如,当使用”from moduleNmae import *”时,不会将以一个下划线开头的对象引入。
“双下划线__”:双下划线的表示的是private类型的变量。只能是允许这个类本身进行访问,连子类也不能,这类属性在运行时属性名会加上单下划线和类名。
类属性访问控制
如果要让类内部属性不被外部访问,需要在属性的名称前加上两个下划线__,
在Python中,变量名如果以__开头,就变成了一个私有变量(private),只有类内部可以访问,外部不能访问。
在Python中,有变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,
特殊变量能直接访问的,不是private变量,所以,不能用__name__、__nu__这样的变量名。
以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是能访问的,
按照约定俗成的规定,这样的变量是,“我能被访问,但是,请把我视为私有变量,不要随意访问”。
python没有任何机制来限制访问控制。双下划线开头的变量是否一定不能从外部访问呢?其实也不是。
不能直接访问__name是因为Python解释器对外把__name变量改成了_Lesson__name,所以,仍然可以通过_Lesson__name来访问__name变量
如果要读取或修改类的私有属性,我们需要在类内部定义读取或修改的实例方法。
class Lesson(object):
student = "you" # 公有的类属性
__nu = 2 # 私有的类属性
# 对象的构造方法(初始化)方法
def __init__(self, name, score):
self.name = name # 公有的类实例属性
self.score = score # 公有的类实例属性
# 实例化对象
lesson1 = Lesson('python', 90)
#print(lesson1.__nu) #错误 不能在类外通过实例对象访问私有的类属性
print(lesson1._Lesson__nu) #正确 Python解释器对外把__nu变量改成了_Lesson__nu

类方法访问控制

相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型