1. 程式人生 > >day25 面向對象繼承

day25 面向對象繼承

money round img nbsp 聯系 老板 直接 沒有 都是

這兩天所學的都是面向對象,後面還有幾天也是它,面向對象主要有三個大的模塊,封裝,繼承,多態,(組合),昨天主要講了面向對象的命名空間,還有組合的用法,今天是講的繼承還有繼承裏面所包括的鉆石繼承,以及多態的知識點。

創建一個類,關鍵字是class,然後後面加上類的名字,首字母大寫即可,創建完了之後就得到了一個類的命名空間,

然後下面就是類的屬性,分為靜態屬性(定義在類中的變量)和動態屬性(定義在類中的方法),

然後就是屬性,屬性是類實例化得出的結果,創建一個屬性就是創建了一個屬性的命名空間,

再就是組合,在一個類中以另外一個類的對象作為屬性,稱為類的組合。

然後就是今天學的繼承(子類對象調用父類方法指名道姓,super),以及繼承裏面的鉆石繼承,,還有就是多態。python本身自帶多態。

對於昨天所學的面向對象的命名空間的回顧:

技術分享圖片
# 命名空間 :
    # 靜態屬性 : 屬於類內部的命名空間
    # 動態屬性 : 屬於類內部的命名空間
    # 對象屬性 : 屬於對象的,在類內和self發生聯系,在類外和對象名發生聯系
    # 可以查看靜態屬性的都有哪些:類名 對象名
    # 可以調用類中的方法的有哪些:類名.方法名(對象),對象.方法名()
    # 類到對象之間沒有聯系,而對象到類之間有聯系。
    # 對象在查找名的時候,會現在我自己的空間裏找,再到類的空間裏找
# 組合 :
    #將一個對象作為另一個類的對象的屬性
    # 老師有生日
    #
圓環 # 人有武器
View Code

面向對象的繼承:

技術分享圖片
#繼承 : 模糊到具體
#抽象 : 具體到模糊
#先抽象後繼承
#繼承有幾種: 單繼承,多繼承
# 貓類 抓老鼠
# 狗類 看門
# 動物 吃 喝 睡
# class Animal:
#     def eat(self):
#         print(‘eating‘)
#
#     def drink(self):
#         print(‘drinking‘)
#
#     def sleep(self):
#         print(‘sleeping‘)
#
# class Cat(Animal):
# def catch_mouse(self): # print(‘yeah‘) # # class Dog(Animal): # def watch_door(self): # print(‘wangwangwang‘) # kitty = Cat() # kitty.eat() # snoopy = Dog() # snoopy.eat() # 人類 狗類 相同的屬性 提取了一個__init__方法,在這個方法裏放一些共有的屬性 # 貓類和狗類 相同的方法 直接把相同的方法提取出來,放在基類裏 # 他大舅他二舅都是他舅 —— 實例化 # 高桌子低板凳都是木頭 —— 繼承 # 人 狗 相同屬性的同時 還有一些不同的屬性 # class Animal: # def __init__(self,aggressivity, life_value,name): # self.name = name # 每一個角色都有自己的昵稱; # self.aggressivity = aggressivity # 每一個角色都有自己的攻擊力; # self.life_value = life_value # 每一個角色都有自己的生命值; # def eat(self): # self.life_value += 10 # # class Person(Animal): # def __init__(self, name, aggressivity, life_value, money): # Animal.__init__(self, 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 # 金老板的攻擊力增加了 # class Dog(Animal): # def __init__(self, name, breed, aggressivity, life_value): # Animal.__init__(self,aggressivity,life_value,name) # self.breed = breed # 每一只狗都有自己的品種; #派生屬性:父類沒有的屬性 # # def bite(self,people): # 派生方法 :父類沒有的方法 # people.life_value -= self.aggressivity # # def eat(self): # Animal.eat(self) # print(‘dog is eating‘) # snoopy = Dog(‘太白‘,‘京巴‘,250,500) # print(snoopy.breed) # print(snoopy.name) # # Animal.eat(snoopy) # snoopy.eat() # print(snoopy.life_value) # snoopy.eat() # print(snoopy.life_value) #派生屬性 : 在自己的init方法裏 使用父類的init方法 —— 指名道姓調用方法 #派生方法 : 在子類中增加父類沒有的 #只要子類有,就有子類的 #只要想用父類,Animal.eat(snoopy) 父類名.父類的方法(子類對象) 2.7經典類中 # 在新式類 # class Animal: # def __init__(self,aggressivity, life_value,name): # self.name = name # 每一個角色都有自己的昵稱; # self.aggressivity = aggressivity # 每一個角色都有自己的攻擊力; # self.life_value = life_value # 每一個角色都有自己的生命值; # def eat(self): # self.life_value += 10 # # 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 # 金老板的攻擊力增加了 # class Dog(Animal): # def __init__(self, name, breed, aggressivity, life_value): # # Animal.__init__(self,aggressivity,life_value,name) # # super(Dog,self).__init__(aggressivity,life_value,name) # super().__init__(aggressivity,life_value,name) # self.breed = breed # 每一只狗都有自己的品種; #派生屬性:父類沒有的屬性 # # def bite(self,people): # 派生方法 :父類沒有的方法 # people.life_value -= self.aggressivity # # def eat(self): # # Animal.eat(self) # super().eat() # print(‘dog is eating‘) # snoopy = Dog(‘太白‘,‘京巴‘,250,500) # print(snoopy.breed) # print(snoopy.name) # snoopy.eat() # print(snoopy.life_value) # super(Dog,snoopy).eat() #Animal.eat(snoopy) # print(snoopy.life_value) #用子類的對象,調用父類的方法: #如果子類中沒有這個方法,直接就使用父類的 #如果子類中有同名方法: # 經典類 指名道姓 類名.方法名(子類對象) 類內外一致 # 新式類 super方法 super(子類名,子類對象).方法名() 類內可以省略super的參數 class Foo: def __init__(self): self.func() def func(self): print(Foo.func) class Son(Foo): def func(self): print(Son.func) s = Son() #鉆石繼承問題
View Code

鉆石繼承:

技術分享圖片
#coding:utf-8
#經典類和新式類的多繼承問題,繼承順序問題
#經典類 : 博大精深 所以經典類就是深度優先
#新式類 :廣度優先
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 —— 新式類
#面試 —— 能對應 新式類 是廣度優先 經典類是深度優先

# 繼承 —— 抽象類和接口類 —— 是一種設計模式

# 多態
View Code

多態:

技術分享圖片
#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


# 繼承
# 子類對象調用父類方法  :指名道姓,super
# 鉆石繼承問題

#多態 - 鴨子類型

#做總結
#寫博客
#畫思維導圖 —— 周五交
#寫大作業 —— 把類設計好寫好,之間的關系理清楚,做完登錄,設計角色的功能
#之前的知識
View Code

技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片

面向對象需要畫思維導圖,這個需要後續補上

day25 面向對象繼承