Python基础-面向对象组合、继承

组合

多个数据属性通过一个类实例化的对象做关联

# -*- 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列表准则

子类会先于父类被检查

多个父类会根据它们在列表中的顺序被检查

如果对下一个类存在两个合法的选择,则选择第一个父类

示例

继承顺序结果示例

扫描二维码关注公众号,回复: 20185 查看本文章
# -*- 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'>)

猜你喜欢

转载自my.oschina.net/zhaojunhui/blog/1795201