组合
多个数据属性通过一个类实例化的对象做关联
# -*- coding:utf8 -*-
class Forest: #定义总类结合-森林
def __init__(self,other): #定义类的属性
self.other = other #总类中的类别
self.addr = Animal() #把其它类别结合到总类中
self.type = Plant()
class Animal: #定义的动物类
def _animal(self): #定义的动物属性
print("这是动物类别")
class Plant: #定义的植物类
def _plant(self): #定义的植物属性
print("这是植物类别")
P = Forest("测试") #总类实例化
print(P.other) #总类自定义类输出
P.addr._animal() #总类结合的其它类输出
测试
这是动物类别
继承
通过集成可以派生(衍生)出新的方法
单继承
# -*- coding:utf8 -*-
class Forest: #定义的父类
def __init__(self,name):
self.Name = name
def action(self):
print("%s是非常厉害的" %self.Name)
class Subclass(Forest): #子类,(衍生)出新的类
print("森林里边")
P = Subclass("猴子") #实例化子类
P.action() #子类调用父类属性
森林里边
猴子是非常厉害的
多继承
# -*- coding:utf8 -*-
class Forest: #定义的父类1
def __init__(self,name):
self.Name = name
def action1(self):
print("%s是非常厉害的" %self.Name)
class Activity: #定义的父类2
def __init__(self,obj):
self.Obj = obj
@staticmethod
def action2(describe):
print("非常的%s" %describe)
class Subclass(Forest,Activity): #子类,(衍生)出新的类
print("森林里边")
P = Subclass("猴子") #实例化子类
P.action1() #调用父类1属性
P.action2("灵活") #调用父类2属性
森林里边
猴子是非常厉害的
非常的灵活
接口继承
父类规定子类必须要使用的类方法,方便程序归一化设计
接口继承示例
# -*- coding:utf8 -*-
import abc
class All_file(metaclass=abc.ABCMeta): #父类定义的方法,限定子类使用方法
@abc.abstractmethod
def a(self): #限制子类方法1
pass
@abc.abstractmethod
def b(self): #限制子类方法2
pass
class new(All_file): #子类继承的方法使用,必须要实现父类方法,否则无法实例化
def a(self):
print("继承的类方法1")
def b(self):
print("继承的类方法2")
P = new()
P.a()
P.b()
继承的类方法1
继承的类方法2
继承顺序
特性
Python的类可以继承多个类,Java和C#中则只能继承一个类
Python的类如果继承了多个类,那么寻找方法有两种:深度优先和广度优先
剖析
对于定义的每一个类,Python计算出一个方法解析顺序(MRO)列表,MRO列表就是所有基类的线性顺序列表。MRO列表的构造是通过一个C3线性化算法来实现的。
MRO列表准则
子类会先于父类被检查
多个父类会根据它们在列表中的顺序被检查
如果对下一个类存在两个合法的选择,则选择第一个父类
示例
继承顺序结果示例
# -*- coding:utf8 -*-
class A:
def test(self):
print("this is A")
class B(A):
def test(self):
print("this is B")
class C(A):
def test(self):
print("this is C")
class D(B,C):
def test(self):
print("this is E")
print(D.__mro__)
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)