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()
猴子在森林~
猴子在森林裏邊跳舞~
相關文章
相關標籤/搜索