面向對象的三大特性之繼承基礎

繼承:繼承是一種建立新類的方式

  在python中,新建的類能夠繼承一個或者多個父類(基類或者超類),新建的類稱爲子類或派生類。python中的繼承分爲倆種,單繼承和多繼承。不是全部的語言都有多繼承,例Java不支持python

查看繼承的方法 __bases__

class A:pass
class B:pass
class C(B,A):pass
print(C.__bases__)  #(<class '__main__.B'>, <class '__main__.A'>)

提示:在python3X中若是沒有指定基類,python的類會默認繼承object類,object是全部python類的基類,它提供了一些常見方法(如__str__)的實現。面試

繼承與抽象(先抽象後繼承)

抽象的做用是爲了劃分類別(能夠隔離關注點,下降複雜度)算法

繼承:是基於抽象的結果,經過編程語言去實現它,確定是先經歷抽象這個過程,才能經過繼承的方式去表達出抽象的結構編程

繼承與重用:子類(派生類)能夠使用父類的全部屬性和方法

class A:pass    #父類
class B(A):pass     #子類(派生類)

繼承與派生:子類在父類的基礎上又先建立了本身須要的方法和屬性

方法調用的順序:python2.7

  子類在調用方法時,若是這個方法子類中有,就直接執行子類的方法,若是沒有而父類有,子類對象就會調用父類的方法執行。編程語言

若是咱們即想要執行子類的方法,也想要執行父類的方法,那麼久須要在子類的方法中去調用父類的方法:spa

    父類名.方法名()   或者supper().方法名()code

class Animal:
    def __init__(self,name,kind,food,language):
        self.name = name
        self.kind = kind
        self.food = food
        self.language = language
    def yell(self):
        print("%s叫"%self.name)
    def eat(self):
        print("吃%s"%self.food)
    def drink(self):
        print("喝水")
class Cat(Animal):
    def __init__(self,name,kind,food,language,eye_color):

        self.eye_color = eye_color    # 派生屬性,
        Animal.__init__(self,name,kind,food,language)   #執行子類的方法,也想要執行父類的方法
        # super().__init__(name,kind,food,language)
    def catch_mouse(self):
        print("抓老鼠")
    def eat(self):          # 不只執行了父類中的基礎功能,還完成了特殊的功能
        Animal.eat(self)    #調用類中eat的方法
        # super().eat()
        self.weight = 10
阿貓 = Cat('阿貓','橘貓','牛雜','喵喵',"綠色")
阿貓.eat()        #吃牛雜
print(阿貓.weight)    #10

 

面試例題:對象

class Foo:
    def __init__(self):
        self.func()     #當類實例化時會直接執行func()方法
    def func(self):
        print("in   Foo")
class Son(Foo):     #繼承Foo類
    def func(self):
        print("in Son")
s1 = Son()    #輸出爲 in Son        #實例化Son()  

抽象類:抽象類是一個規範,它基本不會實現什麼具體的功能,抽象類不能被實例化

運用在多人開發,複雜的需求,後期擴展。    是一種手段來幫助咱們完成規範blog

    # 抽象類是一個規範,它基本不會實現什麼具體的功能,抽象類是不能被實例化
    # 要想寫一個抽象類
        # from abc import ABCMeta,abstractmethod
        # 在這個類建立的時候指定 metaclass = ABCMeta
        # 在你但願子類實現的方法上加上一個 @abstractmethod裝飾器
    # 使用抽象類
        # 繼承這個類
        # 必須實現這個類中被@abstractmethod裝飾器裝飾的方法

多繼承:就是一個子類同時繼承多個父類

 

  新式類

  在新式類中全部多繼承關係尋找方法的順序---遵循廣度優先算法   類名.mro()  查詢繼承方法的順序

    在python3中因此的類都是新式類。因此的新式類都有一個默認的父類:object

class Person1:pass
class Person2():pass
class Person3(object):pass
# p = Person2()  # __init__ 初始化方法
print(Person1.__bases__)    #(<class 'object'>,)
print(Person2.__bases__)    #(<class 'object'>,)
print(Person3.__bases__)    #(<class 'object'>,)

  鑽石繼承法:

  

  經典類:

  經典類在找父類的方法過程當中遵循---深度優先算法。不提供mro方法和super

      在python2.7中經典類和新式類並存

# class Student:pass # 經典類
# class Student(object):pass    #新式類

接口類(瞭解)

# 接口 Interface  接口能夠被多繼承

# Interface FlyAnimal:  # 規範繼承個人類必須實現這個方法
    # def fly():pass

# Interface WalkAnimal:
    # def walk():pass

# Interface SwimAnimal:
    # def swim():pass

# class Tiger(WalkAnimal,SwimAnimal):  繼承了一個規範
#     def walk():代碼
#     def swim():代碼

# 抽象類
# 接口
相關文章
相關標籤/搜索