1. 程式人生 > >python面向對象三大特性之繼承、多態

python面向對象三大特性之繼承、多態

nim 類的屬性 pri dog name 復用性 繼承 python2 調用方法

繼承

什麽是繼承  

  所謂繼承指提供了同一類對象共性的處理方法,子類繼承父類共性的東西。 這樣有利於代碼的復用性,即子類擁有父類的方法。通過繼承創建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。

  繼承可以想象成什麽是什麽的關系

python中類的繼承分為:單繼承和多繼承

技術分享圖片
class Parent1: # 父類1
    pass
class Parent2: #父類2
    pass
class Son1(Parent1):  #單繼承,基類是ParentClass1,派生類是Son1
    pass
class Son2(Parent1,Parent2):  #多繼承,父類是Parent1和Parent2,派生類是Son2
    pass
技術分享圖片

查看繼承

技術分享圖片
>>> Son1.__bases__ #__base__只查看從左到右繼承的第一個父類,__bases__則是查看所有繼承的父類
(<class ‘__main__.Parent1‘>,)
>>> Son2.__bases__
(<class ‘__main__.Parent1‘>, <class ‘__main__.Parent2‘>)
如果沒有指定基類,python的類會默認繼承object類,object是所有python類的基類
>>> Parent1.__bases__
(<class ‘object‘>,)
技術分享圖片 技術分享圖片

# class Animal:   
# def __init__(self,name,eat,drink,push,shit):
# self.name=name
# self.eat= eat
# self.drink= drink
# self.push= push
# self.shit= shit
# class Dog(Animal):
# def cry(self):
# print(‘%s汪汪汪‘%self.name) #在子類中可以使用父類繼承的name
# class Cat(Animal):
# def cry(self):
# print(‘%s喵喵喵‘%self.name)
#
# teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# cat1=Cat(‘加菲‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# print(cat1.name) #調用屬性無需添加()
# teddy.cry() #調用方法需要添加(),因為方法本質是函數
加菲

泰迪汪汪汪
技術分享圖片

在python3中,子類執行父類的方法也可以直接用super方法.

技術分享圖片
# class Animal:
#     def __init__(self,name,eat,drink,push,shit):
#         self.name=name
#         self.eat= eat
#         self.drink= drink
#         self.push= push
#         self.shit= shit
#     def run(self):
#         print(‘%s running‘%self.name)
# class Dog(Animal):
#     def cry(self): 
#         super(Dog,self).run()           #super(Dog,self).run() =Animal().run(self)=super().run()     執行父類的方法
#         print(‘%s汪汪汪‘%self.name)
# class Cat(Animal):
#     def cry(self):   
      super().__init()  #執行父類的屬性     # print(‘%s喵喵喵‘%self.name) # # teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # cat1=Cat(‘附近反‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # print(teddy.name) # teddy.cry()
技術分享圖片

多繼承順序

python3以上(新式類): 廣度優先

python2(經典類) :深度優先

技術分享圖片
class A(object):
    def test(self):
        print(‘from A‘)

class B(A):
    def test(self):
        print(‘from B‘)

class C(A):
    def test(self):
        print(‘from C‘)

class D(B):
    def test(self):
        print(‘from D‘)

class E(C):
    def test(self):
        print(‘from E‘)

class F(D,E):
    # def test(self):
    #     print(‘from F‘)
    pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有這個屬性可以查看線性列表,經典類沒有這個屬性
<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>
#新式類繼承順序:F->D->B->E->C->A #經典類繼承順序:F->D->B->A->E->C #python3中統一都是新式類 #pyhon2中才分新式類與經典類
技術分享圖片

多態

什麽是多態:相同方法調用,執行不同動作

  向不同的對象發送同一條消息(!!!obj.func():是調用了obj的方法func,又稱為向obj發送了一條消息func),不同的對象在接收時會產生不同的行為(即方法)。 也就是說,每個對象可以用自己的方式去響應共同的消息。所謂消息,就是調用函數,不同的行為就是指不同的實現,即執行不同的函數。

技術分享圖片
import abc
class Animal(metaclass=abc.ABCMeta): #同一類事物:動物
    @abc.abstractmethod
    def talk(self):
        pass

class People(Animal): #動物的形態之一:人
    def talk(self):
        print(‘say hello‘)

class Dog(Animal): #動物的形態之二:狗
    def talk(self):
        print(‘say wangwang‘)

class Pig(Animal): #動物的形態之三:豬
    def talk(self):
        print(‘say aoao‘)
def func(object)
  object.talk() #我們可以定義一個統一的接口來使用 三個類都有talk的方法

python面向對象三大特性之繼承、多態