1. 程式人生 > >python-繼承以及繼承問題和多態

python-繼承以及繼承問題和多態

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-繼承以及繼承問題和多態