本篇文章给大家分享的是有关Python中怎么实现访问控制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
通过之前的内容,我们知道,在定义一个类时,类内部可以有属性和方法。我们仍然创建一个学生类Student。
定义好一个类后,我们就可以在类的外部通过生成对象来使用对象的实例变量或调用成员方法来操作数据,从而隐藏类内部的代码逻辑。但是,从类Student的定义来看,在类的外部,我们依然可以通过“对象.属性”的方式对属性进行任意修改。
上述代码中,我们在类的外部生成了一个对象student1,通过student1.name的方式将name修改为CCC,student1的name属性就被修改了。然而,在面向对象编程中,我们往往不希望类内部的属性被类外部的代码直接修改和访问,因此,私有变量的概念应运而生了。
私有变量顾名思义是私有的,类的私有变量只允许类内部代码操作。Python中,私有变量就是在属性开头加两个下划线“__”。
可以看到,一旦将属性设置为私有变量,如果我们试图通过“对象.私有变量”来直接访问的话,Python就会报错了。
Python中,类的属性可以分为公有变量和私有变量两种,公有变量允许类的外部代码通过“对象.属性”的方式直接进行修改和获取,而私有变量则不允许外部代码直接访问。其中,私有变量的命名以两个下划线“__”开头。
需要注意的是,Python中变量名类似__xxx__的,也就是以双下划线开头,并以双下划线结尾的变量不属于私有变量,因此,我们不能使用类似__name__这样的变量名作为私有变量。
在开发过程中,我们有时会碰到以一个下划线开头的实例变量名,比如_age。
从上述代码中我们可以看到,以一个下划线开头的实例变量是可以直接在类的外部代码中通过“对象.属性”的方式进行访问的。但是,Python中有个约定俗成的规定,如果你看到别人的代码中使用了这种以一个下划线开头的实例变量,那么你应该把它当做私有变量,不要直接在外部代码中进行访问。
在定义类的时候,如果把属性设置成私有变量,就不能在类的外部代码中直接访问了。上述代码中,如果我们想要修改或获取私有变量__name,我们可以通过给Student类创建成员方法get_name( )和set_name( )来对__name进行获取和修改。
有了get_name( )方法和set_name( )方法后,我们就可以通过对象调用成员方法来对私有变量__name进行访问了。或许看到这里,你会有这样的疑问:通过“对象.属性”的方式也可以对属性进行修改和获取,为什么一定要设置成私有变量呢?除了封装性上的要求外,使用成员方法还可以给修改设置限制。
上述代码中,我们将学生的年龄限制在10~40之间。此时,若外部代码试图用一个不在此范围内的年龄进行修改时,就会修改失败。通过成员方法修改私有变量可以对传入的参数进行校验,避免传入无效的参数。
如果你刚刚在设置私有变量__name的时候试过在外部代码中使用“对象.__name = 值”的方式,你会发现Python并没有报错,甚至在赋值后可以使用“print(对象.__name)”获取到__name的值。实际上,你用上述方式操作的__name并不是定义类时的那个私有变量__name,我们看一下以下代码。
可以看到,虽然通过“对象.属性”的方式我们修改了一个叫__name的变量,但当我们调用get_name( )方法的时候,私有变量__name的值并没有被修改。这是因为,Python允许对象绑定任意属性,student1.__name操作的__name只是新绑定的一个属性而已,它和定义类时定义的私有变量__name虽然名字相同,却是两个不同的变量。
那么私有变量是不是一定不能从外部访问呢?在Python中,我们之所以不能直接访问私有变量__name,是因为Python解释器对外把__name变量改成了_Student__name。换句话说,其实我们是可以通过“_类名+私有变量名”的方式来直接访问私有变量的。
虽然我们可以通过这种变相的方式直接访问私有变量,但是在实际开发中,我们基本上是抵制这种写法的,因为不同版本的Python解释器可能会把私有变量改成不同的变量名。
以上就是Python中怎么实现访问控制,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。