美文网首页
Python-学习之路-08 OOP -02

Python-学习之路-08 OOP -02

作者: 末世狂人 | 来源:发表于2019-02-15 15:29 被阅读0次

单继承和多继承

  • 单继承:每个类只能继承一个类
  • 多继承:每个类可以继承多个类

单继承的多继承的优缺点

- 单继承:
    - 传承有序、逻辑清晰、语法简单、隐患少
    - 功能不能无限扩展,只能在当前唯一的继承链中扩展
- 多继承:
    - 类的功能扩展方便
    - 继承关系混乱

菱形继承/钻石继承问题

- 多个子类继承一个父类,这些子类然后在被一个类继承,于是继承关系形成一个菱形的图谱
- [MRO] (http://www.cnblogs.com/whatisfantasy/p/6046991.html)
- 关于多继承的MRO
    - MRO就是多继承中,用于保存继承顺序的一个列表
    - python本身采用C3算法来解决多继承/菱形继承的问题
    - MRO列表的计算原则
        - 子类永远在父类前面
        - 如果有多个父类,则根据继承语法中的继承顺序进行获取
        - 如果多个父类又继承自同一个父类,孙子类中只会选取继承语法括号中第一个父类的父亲
class Person():
    name = "NoName"
    age = 0
    sex = "无"
    def init(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        print("我叫{0},我今年{1}岁了,我是一个{2}孩子!".format(name,age,sex))
        
class Eat(Person):
    def eat(self):
        print("eating.........")

class Motion(Person):
    def motion(self):
        print("runing.......")

#多继承
class Student(Eat,Motion):
    pass
        
xiaoming = Student()
xiaoming.init("小明","18","男")
xiaoming.eat()
xiaoming.motion()

我叫小明,我今年18岁了,我是一个男孩子!
eating.........
runing.......
class Person():
    def __init__(self):
        self.name = "NoName"
        self.age = 18
        self.sex = "男"
        print("我叫{0},我今年{1}岁了,我是一个{2}孩子!".format(self.name,self.age,self.sex))
            
persong = Person()
我叫NoName,我今年18岁了,我是一个男孩子!

构造函数

- 在对象进行实例化的时候,系统自动调用的一个函数,通常通过此函数对实例对象进行初始化
- 够着函数一定要有,如果没有,则向上查找(继承的父类),按照MRO顺序,直到查找到为止
class A():
    def __init__(self):
        print("这是A")
        
class B(A):
    def __init__(self):
        print("这是B")
        
class C(B):
    pass

c = C()
这是B
 #如果想在自己的构造函数中调用父类的构造函数,可使用一下方法
class A():
    def __init__(self):
        print("这是A")
        
class B(A):
    def __init__(self):
        print("这是B")
        
class C(B):
    def __init__(self):
        print("这是C")
        ## 方法一
        #B.__init__(self)
        #方法二
        super(C,self).__init__()

c = C()
这是C
这是B

多态

  • 多态就是同一个对象在不同的情况先有不同的状态出现

  • 多态不是语法,是一种设计思路

  • 多态性:

    • 一种调用方式,不同的执行效果
    • 同一种事务的多种形态
  • 多态和多态性:http://www.cnblogs.com/luchuangao/p/6739557.html

  • Mixin设计模式

    • 主要采用多继承方式对类的功能进行扩展
    • 必须表示某一单一功能,而不是某个对象(单一职责),如果有多个功能,则写多个Mixin
    • mixin不依赖于子类的实现
    • 子类即使没有继承这个mixin,也能照样工作,只是缺失部分功能而已
    • 优点:
      • 使用mixin可以在不对类进行任何修改的情况下扩充功能
      • 可以方便的组织和维护不同功能组件的划分
      • 可以根据需要任意调整功能类的组合
      • 可以避免创建很多新的类,导致类的继承混乱
  • Mixin实例:https://blog.csdn.net/u012814856/article/details/81355935

#Mixin
class Displayer():
    def display(self, message):
        #4 打印message
        print(message)

class LoggerMixin(): 
    def log(self, message, filename='logfile.txt'): 
        # 6 打印message
        print("LoggerMixin>>>>>log")
            
    def display(self, message):
        #2 通过当前类(这里的当前列不是LoggerMixin,而是self即MySubClass)的继承链继续调用display方法,从而找到了Displayer中的display
        super().display(message)
        #3 调用当前类的log方法(这里的当前列不是LoggerMixin,而是self即MySubClass)
        self.log(message)

class MySubClass(LoggerMixin, Displayer):
    def log(self, message):
        # 5 通过继承链,找到父类LoggerMixin中的log方法
        super().log(message, filename='subclasslog.txt')
        
subclass = MySubClass()
#1 根据继承链,调用父类LoggerMixin中的display方法
subclass.display("This string will be shown and logged in subclasslog.txt")
This string will be shown and logged in subclasslog.txt
LoggerMixin>>>>>log

类的相关函数

  • issubclass:判断一个类是不是另一个类的子类
  • isinstance:判断一个对象是不是另一个类的实例
  • hasattr:检查一个对象是否有成员xxx
  • getattr:
  • setattr:
  • delattr:
  • dir:获取对象的成员列表

相关文章

  • Python-学习之路-08 OOP -02

    单继承和多继承 单继承:每个类只能继承一个类 多继承:每个类可以继承多个类 单继承的多继承的优缺点 菱形继承/钻石...

  • Python-学习之路-08 OOP -03

    类的成员描述符(属性) 类的成员描述符是为了在类中对类的成员属性进行相关操作而创建的一种方式 成员描述符的三种操作...

  • Python-学习之路-08 OOP -04

    抽象类 抽象方法:没有具体内容实现的方法叫做抽象方法 抽象方法的主要意义是规范子类的行为和借口 抽象类的使用需要借...

  • Python-学习之路-08 OOP -01

    OOP 面向对象 面向对象的特性封装封装就是对对象的成员进行访问限制封装的三个级别公开:public受保护的: p...

  • 17-11-07双色球131期预测

    02 08 11 20 27 31一10 02 08 11 21 26 31一10 02 08 11 21 27 ...

  • 2018-02-08

    2018-02-08 创造_ec1a 2018-02-08 17:08 · 字数 1096 · 阅读 0 · 日记...

  • 山石141期双色球荐蓝

    蓝球范围: 01 02 03 04 05 06 07 08 11 02 03 05 06 07 08 11 02 ...

  • 学习笔记200-我的一天

    【江湖说️❤️学习日记】 [打卡宝宝]:洋芋. [打卡日期]:2019/08/02 [累计坚持]:这是我坚持学习的...

  • 2018年8月2日历史上的今天

    1802年08月02日“全民决定”拿破仑终身执政 1896年08月02日李鸿章访欧 1911年08月02日赵尔丰任...

  • 2018-02-09

    2018-02-08 蒋莺华 2018-02-08 11:02 · 字数 494 · 阅读 7 · 日记本 幸福是...

网友评论

      本文标题:Python-学习之路-08 OOP -02

      本文链接:https://www.haomeiwen.com/subject/ltfmeqtx.html