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属性
森林里边
猴子是很是厉害的
很是的灵活

接口继承

父类规定子类必需要使用的类方法,方便程序归一化设计测试

接口继承示例this

# -*- 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的类若是继承了多个类,那么寻找方法有两种:深度优先广度优先rest

剖析

对于定义的每个类,Python计算出一个方法解析顺序(MRO)列表,MRO列表就是全部基类的线性顺序列表。MRO列表的构造是经过一个C3线性化算法来实现的。code

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'>)

子类调用父类

普通调用

# -*- coding:utf8 -*-
class A:
    def __init__(self,name,forest):
        self.name = name
        self.forest = forest
    def Brief (self):
        print("%s在%s~" %(self.name,self.forest))
class B(A):                                             #父类属性继承
    def __init__(self,name,forest,action):              #派生新的方法
        A.__init__(self,name,forest)                    #父类属性快捷引用
        self.action = action
    def Events(self):
        B.Brief(self)
        print("%s在%s里边%s~" % (self.name, self.forest,self.action))
P = B("猴子","森林","跳舞")
P.Events()
猴子在森林~
猴子在森林里边跳舞~

super()函数方法调用

#-*- coding:utf8 -*-
class A:
    def __init__(self,name,forest):
        self.name = name
        self.forest = forest
    def Brief (self):
        print("%s在%s~" %(self.name,self.forest))
class B(A):                                             #父类属性继承
    def __init__(self,name,forest,action):              #派生新的方法
        super().__init__(name,forest)                   #Python3调用父类属性方法
#       super(B,self).__init__(name,forest)             #Python2调用父类属性方法
        self.action = action
    def Events(self):
        B.Brief(self)
        print("%s在%s里边%s~" % (self.name, self.forest,self.action))
P = B("猴子","森林","跳舞")
P.Events()
猴子在森林~
猴子在森林里边跳舞~
相关文章
相关标签/搜索