day25 面向對象繼承
阿新 • • 發佈:2017-11-21
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):View Code# 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() #鉆石繼承問題
鉆石繼承:
#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 面向對象繼承