当前位置:
首页 > temp > 简明python教程 >
-
python基础(25):面向对象三大特性二(多态、封装)(2)
test(self):
... self.__fa() #只会与自己所在的类为准,即调用_A__fa
...
>>> class B(A):
... def __fa(self):
... print('from B')
...
>>> b=B()
>>> b.test()
from A
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
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数