内容简介:在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用。今天我们继续讲一下Python中面向对象的相关知识点——属性的访问限制。通过之前的内容,我们知道,在定义一个类时,类内部可以有属性和方法。我们仍然创建一个学生类Student。定义好一个类后,我们就可以在类的外部通过生成对象来使用对象的实例变量或调用成员方法来操作数据,从而隐藏类内部的代码逻辑。但是,从类Student的定义来看,在类的外部,我们依然可以通过“对象.属
回顾
在 Python 进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用。今天我们继续讲一下Python中面向对象的相关知识点——属性的访问限制。
属性的种类
通过之前的内容,我们知道,在定义一个类时,类内部可以有属性和方法。我们仍然创建一个学生类Student。
Student类
定义好一个类后,我们就可以在类的外部通过生成对象来使用对象的实例变量或调用成员方法来操作数据,从而隐藏类内部的代码逻辑。但是,从类Student的定义来看,在类的外部,我们依然可以通过“对象.属性”的方式对属性进行任意修改。
修改属性
上述代码中,我们在类的外部生成了一个对象student1,通过student1.name的方式将name修改为CCC,student1的name属性就被修改了。然而,在面向对象编程中,我们往往不希望类内部的属性被类外部的代码直接修改和访问,因此,私有变量的概念应运而生了。
私有变量顾名思义是私有的,类的私有变量只允许类内部代码操作。Python中,私有变量就是在属性开头加两个下划线“__”。
私有变量
可以看到,一旦将属性设置为私有变量,如果我们试图通过“对象.私有变量”来直接访问的话,Python就会报错了。
Python中,类的属性可以分为公有变量和私有变量两种,公有变量允许类的外部代码通过“对象.属性”的方式直接进行修改和获取,而私有变量则不允许外部代码直接访问。其中,私有变量的命名以两个下划线“__”开头。
需要注意的是,Python中变量名类似__xxx__的,也就是以双下划线开头,并以双下划线结尾的变量不属于私有变量,因此,我们不能使用类似__name__这样的变量名作为私有变量。
在开发过程中,我们有时会碰到以一个下划线开头的实例变量名,比如_age。
单下划线开头的实例变量
从上述代码中我们可以看到,以一个下划线开头的实例变量是可以直接在类的外部代码中通过“对象.属性”的方式进行访问的。但是,Python中有个约定俗成的规定,如果你看到别人的代码中使用了这种以一个下划线开头的实例变量,那么你应该把它当做私有变量,不要直接在外部代码中进行访问。
私有变量的访问
在定义类的时候,如果把属性设置成私有变量,就不能在类的外部代码中直接访问了。上述代码中,如果我们想要修改或获取私有变量__name,我们可以通过给Student类创建成员方法get_name( )和set_name( )来对__name进行获取和修改。
成员方法set/get
有了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面向对象中关于属性的访问限制,当然我们对这个限制是要加引号的,因为Python中并没有任何阻止机制对属性的访问进行限制,但是我们仍然需要自觉遵守这些约定俗成的规定,这也是面向对象编程所要求的。感谢大家的支持与关注,欢迎一起学习交流~
【责任编辑:庞桂玉 TEL:(010)68476606】
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 面向Python,面向对象(基础)
- 面向Python,面向对象(基础3)
- <<深入PHP面向对象、模式与实践>>读书笔记:面向对象设计和过程式编程
- 《JavaScript面向对象精要》之六:对象模式
- 《JavaScript面向对象精要》之三:理解对象
- 面向对象的程序设计之理解对象
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
企业应用架构模式
Martin Fowler / 王怀民、周斌 / 机械工业出版社 / 2010-4 / 59.00元
《企业应用架构模式》作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的、关于解决方案的、不可或缺的手册。《企业应用架构模式》获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖。《企业应用架构模式》分为两大部分。第一部分是关于如何开发企业应用的简单介绍。第二部分是《企业应用架构模式》的主体......一起来看看 《企业应用架构模式》 这本书的介绍吧!