当前位置:
首页 > 编程开发 > Python基础教程 >
-
python基础教程之python基础(25):面向对象三大特性二(多态、封装)(2)
本站最新发布 Python从入门到精通|Python基础教程
试听地址 https://www.xin3721.com/eschool/pythonxin3721/
test(self):
... self.__fa() #只会与自己所在的类为准,即调用_A__fa
...
>>> class B(A):
... def __fa(self):
... print('from B')
...
>>> b=B()
>>> b.test()
from A
试听地址 https://www.xin3721.com/eschool/pythonxin3721/
test(self):
2.3 封装与扩展性
封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。
- #类的设计者
- class Room:
- def __init__(self,name,owner,width,length,high):
- self.name=name
- self.owner=owner
- self.__width=width
- self.__length=length
- self.__high=high
- def tell_area(self): #对外提供的接口,隐藏了内部的实现细节,此时我们想求的是面积
- return self.__width * self.__length
- #使用者
- >>> r1=Room('卧室','egon',20,20,20)
- >>> r1.tell_area() #使用者调用接口tell_area
- #类的设计者,轻松的扩展了功能,而类的使用者完全不需要改变自己的代码
- class Room:
- def __init__(self,name,owner,width,length,high):
- self.name=name
- self.owner=owner
- self.__width=width
- self.__length=length
- self.__high=high
- def tell_area(self): #对外提供的接口,隐藏内部实现,此时我们想求的是体积,内部逻辑变了,只需求修该下列一行就可以很简答的实现,而且外部调用感知不到,仍然使用该方法,但是功能已经变了
- return self.__width * self.__length * self.__high
- #对于仍然在使用tell_area接口的人来说,根本无需改动自己的代码,就可以用上新功能
- >>> r1.tell_area()
2.4 property属性
什么是特性property?
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则。
除此之外,看下:
- ps:面向对象的封装有三种方式:
- 【public】
- 这种其实就是不封装,是对外公开的
- 【protected】
- 这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
- 【private】
- 这种封装对谁都不公开
python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现。
- class Foo:
- def __init__(self,val):
- self.__NAME=val #将所有的数据属性都隐藏起来
- @property
- def name(self):
- return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
- @name.setter
- def name(self,value):
- if not isinstance(value,str): #在设定值之前进行类型检查
- raise TypeError('%s must be str' %value)
- self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
- @name.deleter
- def name(self):
- raise TypeError('Can not delete')
- f=Foo('egon')
- print(f.name)
- # f.name=10 #抛出异常'TypeError: 10 must be str'
- del f.name #抛出异常'TypeError: Can not delete'
一个静态属性property本质就是实现了get,set,delete三种方法。
- class Foo:
- @property
- def AAA(self):
- print('get的时候运行我啊')
- @AAA.setter
- def AAA(self,value):
- print('set的时候运行我啊')
- @AAA.deleter
- def AAA(self):
- print('delete的时候运行我啊')
- #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
栏目列表
最新更新
python基础(24):面向对象三大特性一(继承
python基础(25):面向对象三大特性二(多态、
tesseract-OCR + pytesseract安装
Python爬虫(学习准备)
Python输出16进制不带0x补零,整数转16进制
vue添加图片
闭包函数与装饰器
python基础-闭包函数和装饰器
restframework详细
shell编程基本语法和变量
.Net Standard(.Net Core)实现获取配置信息
Linux PXE + Kickstart 自动装机
Shell 编程 基础
Shell 编程 条件语句
CentOS8-网卡配置及详解
Linux中LVM逻辑卷管理
1.数码相框-相框框架分析(1)
Ubuntu armhf 版本国内源
Linux中raid磁盘阵列
搭建简易网站
mysql 安装了最新版本8.x版本后的报错:
Mysql空间数据&空间索引(spatial)
如何远程连接SQL Server数据库的图文教程
复制SqlServer数据库的方法
搜索sql语句
sql中返回参数的值
sql中生成查询的模糊匹配字符串
数据定义功能
数据操作功能
将Session值储存于SQL Server中