首页 > Python3教程 > Python3类与面向对象

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

Python3 类访问控制

类方法访问控制

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。