博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象进阶
阅读量:4595 次
发布时间:2019-06-09

本文共 3152 字,大约阅读时间需要 10 分钟。

---恢复内容开始---

  • 继承(简单的面试题)
  • 抽象类(重要)
  • 接口类(主要是python和java的区别)
  • 多继承(c3算法和__mro__)

一  继承(简单的面试题) 

class Base:    def __init__(self):        self.func()    def func(self):        print('in base')class  Son:    def func(self):        print('in son')s= Son()# print(s.func())# print(s) #按题意思看: 结果是不打印任何东西,因为自己没有调用任何方法.想要打印让下面类继承上面类

修改后:

# 继承的面试题class Base:    def __init__(self):        self.func()    def func(self):        print('in base')class  Son(Base):    def func(self):        super().func()        print('in son')s= Son()print(s.func())  print(s) 打印结果:

in base

in son
in base
in son
None

二 抽象类

# 抽象类:是规范下面子类中某些方法用的,必须要有继承关系# 具体例子from abc import ABCMeta,abstractmethod #(抽象方法)class Pyment(metaclass=ABCMeta):  #  metaclass=ABCMeta表示类pyment是一个规范类    @abstractmethod  # 表示下面一行中的pay方法是一个必须在子类中实现的方法(下面的方法名字必须子类中的一样)    def pay(self):        pass  # 可以不用写东西class WeChatPay(Pyment):    def __init__(self,name):        self.name=name    def pay(self,money):        print('%s通过微信消费了%s元'% (self.name,money))class AliPay(Pyment):    def __init__(self,name):        self.name = name    def pay(self,money):        # 支付宝提供了一个网络上的联系渠道        print('%s通过支付宝消费了%s元'%(self.name,money))class ApplePay(Pyment):    def __init__(self,name):        self.name = name    def pay(self,money):       print('%s通过苹果支付消费了%s元'%(self.name,money))# 归一化设计:也就是把实例化,传参放到一个函数里,def pay_func(person,payway,money):    if payway == 'alipay':        per = AliPay(person)    elif payway == 'wechatpay':        per = WeChatPay(person)    elif payway == 'ApplePay':        per = ApplePay(person)    per.pay(money)pay_func('alex','alipay',200)  # 从下面直接给函数传参数 然函数去做判断 然后去实例化一个对象a=Pyment()#  错的.抽象类是不能实例化的  # 规定: Pyment# 就是一个规范类, 这个类存在的意义不在于实现实际的功能, 而是为了约束所有的子类必须实现pay的方法# 抽象类的特点:# 必须在类定义的时候指定metaclass = ABCMeta# 必须在要约束的方法上方加上@abstractmethod方法

三 接口类:

python     # 抽象类 : 抽象类中的方法可以写一些具体的py代码(规范)     # 单继承     # 多继承 # java # 不支持多继承,新的概念 接口 Interface # 和抽象类几乎一模一样的功能 :     # 只定义一个接口名字(基类名),内部定义子类必须实现的方法     # 接口支持多继承     # 接口内部的所有方法都不能写具体的代码,只能用pass代替 # 抽象类  :     # 单继承的形容,并且在单继承中可以在方法中写python代码 # 接口类  :  更接近java中的接口的概念     # python中由于有了抽象类的多继承,不需要接口的概念了     # 一个基类写出来被子类多继承了 : 接口类     # 并且在方法中只写pass(你可以选择性的满足)

四 多继承(c3算法和__mro__)

例子 :

# 首先class A:    pass    def func(self):print('A')class B(A):    pass    def func(self):print('B')class C(A):    pass    def func(self):        print('C')class D(B):    pass    def func(self):        print('D')class E(C):    pass    def func(self):print('E')class F(D,E):    pass    # def func(self):print('F')f= F()print(f.func())print(F.__mro__) # python2 :两种类# python3 :只有一种类    # 新式类 : 默认继承object类 # object 是所有类的父类        # 为什么可以不写__init__?        # 所有object中的类都是你自己不写也可以调用的# 区别# 钻石继承问题/多继承的优先级问题# 在python3中 所有的类都是新式类,所有的新式类的继承顺序都遵循C3算法,也叫广度优先算法# 可以使用类名.__mro__()这个方法来查看这个继承顺序# super 在多继承中执行顺序也遵循C3算法

例子二 :

class A:    def func(self):print('A')class B(A):    def func(self):        super().func()        print('B')class C(A):    def func(self):        super().func()        print('C')class D(B,C):    def func(self):        super().func()        print('D')b = D()print(b.func())

A

C
B
D
None

 

 

 

---恢复内容结束---

转载于:https://www.cnblogs.com/systemsystem/p/10007476.html

你可能感兴趣的文章
对比 Git 与 SVN,这篇讲的很易懂
查看>>
【snmp】Linux开启snmp及查询
查看>>
CSU 1532: JuQueen(线段树)
查看>>
设定MyEclipse编辑代码区域文字的大小及非keyword的字体、字形和颜色
查看>>
LeetCode【6】. ZigZag Conversion --思路图解与java实现
查看>>
git 合并分支
查看>>
NSNotification与NSNotificationCenter
查看>>
qt 中文乱码 处理QByteArray类型里含中文的数据
查看>>
跨库事务一致性问题的解决方式(例)
查看>>
ios build时,Undefined symbols for architecture xxx问题的总结
查看>>
JavaScript对象
查看>>
南理第八届校赛同步赛-C count_prime//容斥原理
查看>>
CentOS7.4下使用Nginx配置Asp.net Core和添加Https证书步骤
查看>>
常用模块介绍
查看>>
一台云服务器怎么同时响应多个域名?
查看>>
【黑客免杀攻防】读书笔记1 - 初级免杀基础理论(反病毒软件特征码提取介绍、免杀原理、壳)...
查看>>
Java 枚举类
查看>>
noip模拟赛 PA
查看>>
Codeforces 717.F Heroes of Making Magic III
查看>>
noip2011 选择客栈
查看>>