当前位置: 首页 > 科技观察

Python面向对象访问控制

时间:2023-03-12 09:33:04 科技观察

复习在Python进阶记录基础(十五)中介绍了面向对象的基本概念和Python中类和对象的基本知识,需要重点介绍的是类和对象的使用。今天我们继续聊Python中面向对象的知识点——属性访问限制。属性的类型通过前面的内容我们知道,在定义类的时候,类内部可以有属性和方法。我们仍然创建一个学生类Student。Student类定义了一个类之后,我们可以在类外生成对象来使用对象的实例变量或者调用成员方法来操作数据,从而将代码逻辑隐藏在类内部。但是,从类Student的定义来看,在类之外,我们仍然可以通过“object.property”这个方法来任意修改属性。修改属性在上面的代码中,我们在类外生成了一个对象student1,通过student1.name的方式将名字改为CCC,修改了student1的name属性。但是,在面向对象编程中,我们往往不希望类内部的属性被类外部的代码直接修改和访问,于是私有变量的概念应运而生。私有变量顾名思义就是私有的,类的私有变量只允许被类内部的代码操作。在Python中,私有变量就是在属性的开头加上两个下划线“__”。从私有变量可以看出,一旦属性被设置为私有变量,如果我们试图通过“object.privatevariable”直接访问它,Python会报错。在Python中,类的属性可以分为公有变量和私有变量。公共变量允许类的外部代码通过“object.attribute”方法直接修改获取,而私有变量不允许外部代码直接访问。其中,私有变量的名称以两个下划线“__”开头。需要注意的是,Python中的变量名类似于__xxx__,即双下划线开头和双下划线结尾的变量不是私有变量。因此,我们不能使用像__name__这样的变量名作为私有变量。在开发过程中,我们有时会遇到以下划线开头的实例变量名,例如_age。单下划线开头的实例变量从上面的代码我们可以看出,可以在类的外部代码中通过“object.property”方法直接访问下划线开头的实例变量。但是,Python中有一个习惯规则,如果你在别人的代码中看到这个以下划线开头的实例变量,那么你应该将其视为一个私有变量,不要在外部代码中直接访问它。访问私有变量在定义类时,如果将属性设置为私有变量,则不能在类的外部代码中直接访问。在上面的代码中,如果我们想要修改或获取私有变量__name,我们可以通过为Student类创建成员方法get_name()和set_name()来获取和修改__name。成员方法set/get有了get_name()方法和set_name()方法后,我们就可以通过对象调用成员方法来访问私有变量__name了。或许看到这里,你会有这样的疑问:通过“object.property”的方法,你也可以修改和获取属性,为什么一定要设置为私有变量呢?除了封装要求,使用成员方法也可以对修改进行限制。设置修改限制在上面的代码中,我们将学生的年龄限制在10到40之间。此时,如果外部代码试图修改不在这个范围内的年龄,修改就会失败。通过成员方法修改私有变量,可以对传入的参数进行校验,避免传入无效参数。如果你只是在设置私有变量__name时尝试在外部代码中使用“object.__name=value”方法,你会发现Python并没有报错,甚至可以使用“print(object.__name)”赋值后得到__name的值。其实你上面这种方式操作的__name并不是定义类时的私有变量__name。让我们看一下下面的代码。对象绑定实例变量可以看出,虽然我们通过“object.property”修改了一个名为__name的变量,但是当我们调用get_name()方法时,私有变量__name的值并没有被修改。这是因为Python允许对象绑定到任何属性。student1.__name操作的__name只是一个新绑定的属性。虽然它和定义类时定义的私有变量__name同名,却是两个不同的变量。.那么私有变量一定不能从外部访问吗?在Python中,我们之所以不能直接访问私有变量__name,是因为Python解释器把__name变量改成了_Student__name。也就是说,其实我们可以直接通过“_类名+私有变量名”来访问私有变量。重定向直接访问私有变量虽然我们可以通过这种变相的方式直接访问私有变量,但是在实际开发中,我们基本抵制这种写法,因为不同版本的Python解释器可能会将私有变量to改成不同的变量名。综上所述,以上内容介绍了Python面向对象中对属性的访问限制。当然,我们需要给这个限制加上引号,因为Python中没有阻塞机制来限制对属性的访问,但是我们还是需要自觉地遵守这些约定,这也是面向对象编程所要求的。感谢您的支持与关注,欢迎一起学习交流~