面向对象之多态,property
多态:
同一种事物有多种状态
多态性:
在不考虑对象具体类型的前提下直接调用对象下的方法
静态多态性和动态多态性
静态多态性:都可以进行+操作
动态多态性:不考虑对象具体类型调用方法
多态的好处:
①增加了程序的灵活性
②增加了程序的可扩展性
多态的用法
为了规范子类的方法
定了抽象类,抽象类无需实现具体的方法,但继承了抽象类的子类必须实现抽象类的方法,否则报错
import abc
class Foo(metaclass = abc.ABCMeta):
def run(self):
pass
class Person(Foo):
@abc.abstractmethod
def run(self):
pass
property 将类中方法伪装成属性
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
f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA
property的原理,是一个非数据描述符,修改了get函数,调用属性时返回的是该属性名对应的绑定方法(参数为实例名)
class Lazyproperty:
def init(self,func):
self.func=func
def get(self, instance, owner):
print('这是我们自己定制的静态属性,r1.area实际是要执行r1.area()')
if instance is None:
return self
return self.func(instance) #此时你应该明白,到底是谁在为你做自动传递self的事情
class Room:
def init(self,name,width,length):
self.name=name
self.width=width
self.length=length
@Lazyproperty #area=Lazyproperty(area) 相当于定义了一个类属性,即描述符
def area(self):
return self.width * self.length
r1=Room('alex',1,1)
print(r1.area)
最新文章
- 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击
- ZooKeeper基本原理
- 有关iOS系统中调用相机设备实现二维码扫描功能的注意点(3/3)
- JS 的事件委托机制
- Redis中统计各种数据大小的方法
- [转]Spring注解原理的详细剖析与实现
- Sping Environment为Null的原因和解决方法
- 解决AndroidADT自带Eclipse编辑器不能自动代码提示的问题
- Codeforces Round #379 (Div. 2) 总结分享
- ado.net的5个主要对象
- UML建模之状态图(Statechart Diagram)
- Android应用开发提高篇(6)-----FaceDetector(人脸检测)
- springMVC源码分析--AbstractUrlHandlerMapping(三)
- 关于get和post请求的区别
- 001_ajax学习
- pl/sql破解方法
- shell和shell脚本基本知识
- STM32CubeF4 FreeRTOS Examples don't work correctly with HAL_GetTick
- Java常用类(二)String类详解
- Ubuntu16 nginx安装http_image_filter_module模块