在python中,新建的類能夠繼承一個或者多個父類(基類或者超類),新建的類稱爲子類或派生類。python中的繼承分爲倆種,單繼承和多繼承。不是全部的語言都有多繼承,例Java不支持python
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():代碼 # 抽象類 # 接口