python-繼承以及繼承問題和多態
阿新 • • 發佈:2017-11-21
alt 字符 面向 什麽 get 避免 類對象 小結 base
繼承示例
# 面向對象的三大特性之一:繼承
# 繼承:至少有兩個類:什麽是什麽的關系,為了避免幾個類之間有相同的代碼
# 父類:Animal
# 子類:Dog Person
# 動物
# python中有兩種類:經典類和新式類
# python3中是只有新式類---都默認繼承object,class Animal(object) == class Animal:
# python2經典類和新式類並存
# class Animal: -->是經典類
# class Animal(object):--->新式類
# class ParentClass1: #定義父類
# pass
#
# class ParentClass2: #定義父類
# pass
#
# class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
# pass
#
# class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類
# pass
# SubClass1.__bases__ #__base__只查看從左到右繼承的第一個子類,__bases__則是查看所有繼承的父類
小結:
# 兩個類中有相同的代碼
# 繼承:把相同的代碼放在父類中,子類的對象在子類中沒有找到方法的時候,會使用父類的
# 單繼承和多繼承
# 父類也稱為超類或基類
# 子類又稱為派生類
# 抽象和繼承的關系:先抽象再繼承
class Animal: def __init__(self, name,aggressivity,life_value): self.name = name self.aggressivity = aggressivity self.life_value = life_value def eat(self): self.life_value+=10 class Dog(Animal): def __init__(self, name, breed, aggressivity, life_value): Animal.__init__(self,name,aggressivity,life_value) self.breed = breed #派生屬性:父類沒有的屬性 def bite(self,people): #派生方法:父類沒有的方法 people.life_value -= self.aggressivity #人 class Person(Animal): def __init__(self, name, aggressivity, life_value, money): # Animal.__init__(self,name,aggressivity,life_value)super().__init__(name,aggressivity,life_value) #新式類 self.money = money #派生屬性:父類沒有的屬性 def attack(self,dog): #派生方法:父類沒有的方法 dog.life_value -= self.aggressivity def get_weapon(self,weapon_obj): if self.money > weapon_obj.price: self.money -= weapon_obj.price # 金老板花錢買武器 self.weapon = weapon_obj # 金老板裝備打狗棒 self.aggressivity += weapon_obj.aggr # 金老板的攻擊力增加了 snoopy= Dog(‘太白‘,‘京巴‘,250,500) print(snoopy.name) print(snoopy.breed) snoopy.eat() print(snoopy.life_value) super(Dog,snoopy).eat() #Animal.eat(snoopy) print(snoopy.life_value)
派生屬性:在自己的init方法裏 使用父類的init方法 ---指名道姓調用方法面試題:
# 派生方法:在子類中增加父類沒有的
# 只要子類有,就用子類的屬性或方法
# 只要想用父類的,就用Animal.eat(snoopy) 父類名.父類的方法(子類對象) ---這是2.7經典類中的調用方法
# 在新式類中需要使用super方法 super(子類名,子類對象).方法名() 類內可以省略super的參數 --這是新式類中的
# 用子類的對象,調用父類的方法:
# 如果子類中沒有這個方法,直接使用父類的
# 如果子類中有與父類同名的方法:
# 經典類:指名道姓調用 類名.方法名(子類對象) 類內外一致
# 新式類:使用super方法,super(子類名,子類對象).方法名() 類內可以省略super的參數
鉆石繼承問題
# 本小節的環境是在python2.7中 # 經典類和新式類的多繼承問題,繼承順序問題 # 經典類:博大精深,所以經典類就是深度優先,先往深處找 # 新式類:廣度優先 class F(object): pass def f(self): print(‘F‘) class E(F): pass def f(self): print(‘E‘) class D(F): pass # def f(self): # print(‘D‘) class B(D): pass # def f(self): # print(‘B‘) class C(E): pass def f(self): print(‘C‘) class A(B,C): pass # def f(self): # print(‘A‘) a = A() a.f() print(A.mro()) #新式類:查看繼承順序 # class A(object):pass #新式類 # py3 —— 廣度優先 # py2 —— 新式類 #面試 —— 能對應 新式類 是廣度優先 經典類是深度優先
多態
#python不支持多態的 class Animal:pass class Person(Animal): def attack(self): pass class Dog(Animal): def attack(self): pass def attack(obj): #多態 obj.attack() d = Dog() p = Person() attack(d) #d.attack() attack(p) #p.attack() print(10) #鴨子類型 list tuple是一對鴨子類型 #列表 #元組 # 切片 : 字符串 列表 元組 # + :字符串 列表 數字 def len(l):pass
python-繼承以及繼承問題和多態