单继承和多继承
- 单继承:每个类只能继承一个类
- 多继承:每个类可以继承多个类
单继承的多继承的优缺点
- 单继承:
- 传承有序、逻辑清晰、语法简单、隐患少
- 功能不能无限扩展,只能在当前唯一的继承链中扩展
- 多继承:
- 类的功能扩展方便
- 继承关系混乱
菱形继承/钻石继承问题
- 多个子类继承一个父类,这些子类然后在被一个类继承,于是继承关系形成一个菱形的图谱
- [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
多态
-
多态就是同一个对象在不同的情况先有不同的状态出现
-
多态不是语法,是一种设计思路
-
多态性:
- 一种调用方式,不同的执行效果
- 同一种事务的多种形态
-
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:获取对象的成员列表
网友评论