#装饰器是在不修改被装饰对象源代码以及调试方式的前提下为被装饰对象添加新功能的可调用对象
# property是一个装饰器,是用来绑定给对象的方法伪造成一个数据属性
# 案例一
# class People:
# def __init__(self,name,weight,height):
# self.name=name
# self.weight=weight
# self.height=height
# @property
# def bmi(self):
# return self.weight/(self.height**2)
# obj1=People("tom",140,175)
# # print(obj1.bmi())
# print(obj1.bmi)
# obj1.height=180
# # print(obj1.bmi())
# print(obj1.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("必须传入str类型")
# return
# self.__name=val
# def del_name(self):
# print("不让删除")
# name=property(get_name,set_name,del_name)
# obj1=People("haha")
# # print(obj1.get_name())
# print(obj1.name)
# obj1.set_name("HAHA")
# # print(obj1.get_name())
# print(obj1.name)
# obj1.del_name()
# 案例三
# class People:
# def __init__(self,name):
# self.__name=name
# @property
# def name(self):
# return self.__name
# @name.setter
# def name(self,val):
# if type(val) is not str:
# print("必须传入str类型")
# return
# self.__name=val
# @name.deleter
# def name(self):
# print("不让删除")
# obj1=People("tom")
# print(obj1.name)
# obj1.name="TOM"
# print(obj1.name)
# 1.什么是继承
# 一:继承是一种创新类的方式,新建的类可以称为子类或派生类,父类又称为基类或超类,
# 子类遗传父类的特性
# 二:需要注意的是:Python支持多继承,在Python中,新建的类可以继承一个或多个类
# class Parent1(object):
# x=111
# class Parent2(object):
# pass
# class Sub1(Parent1):
# pass
# class Sub2(Parent2):
# pass
# print(Sub1.__bases__)#(<class '__main__.Parent1'>,)
# print(Sub2.__bases__)#(<class '__main__.Parent2'>,)
# print(Sub1.x)
#ps1:在Python2中有新式类和经典类之分
#新式类:继承了object类的子类,以及该子类的子类的子子类
#经典类:没有继承object类的子类,以及该子类的子子类
#PS2:在Python3 中没有继承任何类,那么默认为继承object类
#所以Python3中的类为新式类
# 三:Python的多继承
# 优点:子类可以同时遗传多个父类的属性,最大限度的重用代码
# 缺点:1.违背人类的思维习惯,继承表达的是一种什么“是”什么的关系
# 2.代码的可读性会变差
# 3.不建议使用多继承,有可能会引发可恶的菱形问题,扩展性变差,如果真的涉及到
# 一个子类不可避免地要重用多个父类的属性,应该使用Mixins
# 2.为何要用继承?用来解决类与类之间代码冗余问题
# 3.如何实现继承?
#一、菱形问题介绍与mro
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B,C):
pass
print(D.__bases__)
print(B.__bases__)
print(D.mro())
#D->B->C->A->object
#总结:类相关属性的查找都是参照该类的mro
# 二:如果多继承是非菱形继承,经典类与新式类的属性查找顺序一样
#都是一个分支一个分支的找下去,然后object
# 三:如果多继承是菱形继承,经典类与新式类的属性查找顺序不一样
# 经典类:深度优先,会在检索第一条分支时一条道走到黑,即会检索共同的父类
# 新式类:广度优先,会在检索最后一条分支时检索共同的父类
# 总结:多继承要不要用?
# 要用,但要规避几点问题/1、继承结构尽量不要过于复杂
# 2、推荐使用mixins机制,在多继承的背景下满足继承的什么
# “是”什么的关系