python基础-day21

# 再来谈谈多继承的,继承原则,
# 当一个节点可以在深度广度上都有机会被访问到的时候,优先从广度上查找
# 这几句话也间接的说明了,那个节点,有两条路可以被访问,
# 而优先从广度上查找,意思就是后面找得到的,暂时就不找了,
# 
# 
# 对于一些难懂的代码,翻译层中文帮助理解,
# 
# 
# 要总结,因为这个可以帮你把以天为单位存储的知识,
# 融合为一个整体,因为在真正使用的时候,你不知道你会用到哪个知识点,
# 


# len()  和 __len__()
# 只有一个类中实现了__len__()方法,才能使用len()函数
# def len2(obj):  # 归一化设计
#     return obj.__len__()

# 归一化设计,就是说,
# 列表,集合,元组等,都能通过len()这一个方法获取长度,
# 是因为这些类型的数据,在其类的内部,都实现了同一个接口,即__len__()方法,

l = [1,2,3]
print(len(l))   #打印结果为:3
print(l.__len__())      #打印结果为:3
print('__len__' in list.__dict__)   #打印结果:True,说明list类里面实现了__len__方法,


# 创建一个规范
from abc import ABCMeta,abstractmethod   #!!!python中的抽象类,需要借助于这个模块来实现,
class Payment(metaclass=ABCMeta):     #抽象类 接口类  规范和约束  metaclass指定的是一个元类,说明这个类是抽象类(或者说是接口类)
                                      #无论是抽象类还是接口类metaclass=ABCMeta之后,都代表这个类不可以被实例化
    s = 'haha'
    @abstractmethod                     #被abstractmethod修饰之后,子类就继承了这个方法,子类需要去实现,如果子类也打算当抽象类,我还没试过,
                                        # 打印子类的__dict__,里面会有 '__abstractmethods__': frozenset({'pay'}),键的意思是抽象方法,此时子类也是抽象类了,
                                        #故如果子类不实现继承来的抽象方法,就无法实例化,
                                        # 通过type查看抽象类,会打印:<class 'abc.ABCMeta'>,即抽象类,
                                        #有些时候,与其说抽象类方法不实现,还不如说是子类已经继承,如果不实现子类就无法实例化,
                                        # 而实现继承来的方法,首先就调用的是子类自己实现的方法,
    def pay(self):
        print(Payment.s)
        pass  # 抽象方法

class Alipay(Payment):
    pass
    def pay(self,money):
        pass
        # print(Payment.pay(money))
        # print('使用支付宝支付了%s元'%money)

class QQpay(Payment):
    def pay(self,money):
        print('使用qq支付了%s元'%money)

class Wechatpay(Payment):
    def pay(self,money):
        print('使用微信支付了%s元'%money)
    def recharge(self):pass

def pay(a,money):
    a.pay(money)

a = Alipay()
a.pay(100)
print(Alipay.__dict__)
print(type(Alipay)) #<class 'abc.ABCMeta'>,即抽象类,
print(type(Payment))    #<class 'abc.ABCMeta'>


# 下面这么多看起来差不多的调用方法,是想说,归一化设计之后,不同类可以使用相同的函数去调用
a = Alipay()
a.pay(100)
pay(a,100)    # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
q = QQpay()
q.pay(100)
pay(q,100)
w = Wechatpay()
pay(w,100)   # 如果把Wechatpay类的pay方法名改为fukuan,这里就会报错,所以目前这种情况是不会报错的,

# ps:
#关于子类得实现继承自抽象类的方法,这个实现是说,你必须def,但是里面的内容可以是pass语句,
#抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。


# 抽象类和接口类
# java 编程原则和设计模式
# 设计模式  程序设计 具有里程碑意义的设计方式 从java中演变出来的
# 单例模式是一种设计模式,即一个类只有一个实例
## 算法导论  计算的方法 时间和空间的问题 权威通用

#java不能多继承

# 编程原则
    # python
    # 开放封闭原则
        # 开放 对扩展是开放的
        # 封闭 对修改是封闭的
    # 依赖倒置原则
    # 接口隔离原则
# 已经写完的程序代码是不允许修改的


# 依赖倒置原则:!!!!!!!
# 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程


# 1,在继承抽象类的过程中,我们应该尽量避免多继承,
# 2,而在继承接口的时候,我们反而鼓励你来多继承接口,
#头一句好理解,抽象使得我们的结构变的复杂,用前面讲多继承时候的话来说,就是给自己挖坑
#而第二句,可能是由于一个继承于多个,而且继承的目的是为了统一实现,所以推荐吧,还有待深入思考


# 1,在抽象类中,我们可以对一些抽象方法做出基础实现
# 2,而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现
# 关于抽象类方法的实现与否,我觉得更多是一种建议,编译器并没有强制要求你不能写,
# 因为在编译器的角度来说,你只要有def,哪怕函数实现是pass,编译器好像也认为你实现了,
# 其次,子类继承抽象类,子类如果不实现父类的方法,就无法实例化,实现了之后,就首先调用的是自己的方法,
# 所以从多个侧面来分析,外加我们最初定义抽象类就不是想要在抽象类中实现什么方法,
# 所以可以理解为抽象类中可以做出一些基础实现,而接口中并不实现,
# 最上面两句的规定,我个人理解,更多是出于一种建议.


#!!!!!感觉下面接口的列子和总结,都很简洁,就没必要自己修改了,直接用了,
# 什么叫接口
# python里没有接口的概念
# 那接口是哪儿来的概念呢?
    # java类没有多继承 接口可以实现多继承
# 描述动物园
# 会游泳的 会走路的 会爬树的 会飞的
# 老虎
# 青蛙
# 天鹅
# 猴子
from abc import ABCMeta,abstractmethod
class FlyAnimal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):pass
    @abstractmethod
    def cal_flying_speed(self):pass
    @abstractmethod
    def cal_flying_height(self):pass
class WalkAnimal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):pass
class SwimAnimal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):pass
class Tiger(WalkAnimal,SwimAnimal):
    def walk(self):pass
    def swim(self):pass
class Monkey:
    def walk(self):pass
    def climb(self):pass
class Swan(FlyAnimal,WalkAnimal,SwimAnimal):
    def swim(self):pass
    def walk(self):pass
    def fly(self):pass
    def cal_flying_speed(self):pass
    def cal_flying_height(self):pass
class Parrot(FlyAnimal):
    def fly(self):pass
    def cal_flying_speed(self):pass
    def cal_flying_height(self): pass
# 所有会飞的动物 具有一些会飞的动物的特性
# 所有会走的动物 具有一些会走的动物的特性

# 接口类的作用:
    # 在java中,能够满足接口隔离原则,且完成多继承的约束
    # 而在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了

# 抽象类和接口类
# 在python中
    #并没有什么不同,都是用来约束子类中的方法的
    #只要是抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现
    #需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束

# 在java中
    # 抽象类和接口截然不同
    # 抽象类的本质还是一个类 是类就必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么它只能被一个父类控制
    # 当多个类之间有相同的功能也有不同的功能的时候 java只能用接口来解决问题

# 面试的时候
    # 抽象类 是python中定义类的一种规范
    # 接口,ps:!!!!!!!!我自己补充的,接口就是java为我们提供的一种机制,帮助我们解决,多个类之间有相同的功能,也有不同的功能,
# 在公司类写代码的时候
    # 如果遇到抽象类 记得按照抽象类中的规范一一实现对应的方法,ps:我自己补充点,简单说,项目中以别人的规范作为参考来写,


# 接口是为了规范写法,特别是多人编程的情况下,显得非常重要,
# 而如果就你一个人,用不用接口来规范编写,就不是那么重要了,


猜你喜欢

转载自blog.csdn.net/qq_18973645/article/details/79960901
今日推荐