面向对象4

今日内容
1.property # 其实就是个装饰器
2.继承介绍:
python支持多继承:
优点
缺点
新式类与经典类
3.如何找出继承关系-》抽象
4.属性查找顺序:
类.数据属性或者函数属性
对象.数据属性或者函数属性
5.继承的实现原理:
MRO
菱形问题/砖石问题
多继承背景下的属性查找探索

----------------------------------------------------------------
装饰器是在不修改被装饰对象源代码以及调用方式的前提下为被装饰对象添加新功能的可调用对象.
可调用对象:目前类,函数,模块都属于可调用对象
property就是一个装饰器,他是用类去实现的装饰器
property是一个装饰器,那么他到底是干什么的呢???
property是一个装饰器,是用来绑定给对象的方法伪装成一个数据属性
体质参数:体重/身高的平方=BMI值,如果BMI指数18.5-23.9就是正常
案例一:
class D:
def __init__(self,weight,height):
self.weight = weight
self.height = height
@property
def BMI(self):
return self.weight / (self.height ** 2)
obj = D('70','180')
obj.BMI # 以前我们调用对象函数属性的时候是需要加括号,但是加了装饰器就不需要加括号了
案例二:
class People:
def __init__(self,name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self,val):
if type(val) is not str:
print('必须传入字符串')
return
self.__name = val
def del_name(self):
print('不让删除')
name=property(get_name,set_name,del_name)
# property接受的是他们三个函数的属性
obj = People('egon')
print(obj.name) # 如果是这种property会检索到认为是查找名字,然后调用get_name函数
obj.name = 'EGON' # 如果是这种property会检索到认为是修改名字,然后调用set_name函数
del obj.name # 如果是这种property会检索到认为是删除名字,然后调用del_name函数方法
案例三:
第一步是 把跟需要 '操作的数据属性名字'有关的'所有函数属性名字'都改成我们需要操作的那个数据属性的名字。
class People:
def __init__(self,name):
self.__name = name
# 如果你想让这个函数对应的操作是obj1.name那么你就需要加一个@property
@property
def name(self):
return self.__name
@name.setter
def name(self,val):
# 如果你想让这个函数对应的操作是obj1.name = 'EGON'
那么你就需要加一个@name.setter
if type(val) is not str:
print('必须传入字符串')
return self.__name = val
@name.deleter
def name(self):
# 如果你想让这个函数对应的操作是obj1.name = 'EGON'
那么你就需要加一个@name.deleter
print('不让删除')
# 用法跟案列二用法一样。也是直接访问数据属性,不用加__

posted @ 2021-07-18 11:37  点滴180  阅读(22)  评论(0编辑  收藏  举报