day24 02 單繼承(派生)python
一、首先來看一個簡單的例子spa
好比:code
狗類的屬性有:吃,喝,看門對象
鳥類的屬性有:吃,喝,下蛋blog
看門和下蛋就是這兩種動物不一樣的屬性,而吃喝是兩個共同的屬性繼承
如下代碼實現了將一個子類的self傳入父類中,而後實現了對共同屬性的操做,也實現了不一樣屬性的操做:遊戲
class Animal: def __init__(self): # 由於狗類中沒有可執行的_init_文件,因此執行的是父類的,可是這裏的self再也不是Animal自己的self了,而是狗類建立的self print('執行Animal._init_') self.func() # 由於傳進來的是狗類的self也就是Dog,因此self.func=Dog.func def eat(self): print('%s eating'%self.name) def drink(self): print('%s drinking'%self.name) def func(self): print('Animal.func') class Dog(Animal): # 建立了狗類的self,可是沒有找到自身的_init_文件,因此會向父類中尋找 def guard(self): print('guarding') def func(self): print('Dog.func') dog = Dog() # 在這裏調用的時候,執行的是Animal裏面的init文件,可是在執行以前就在狗類裏面先建立了一個狗類的self class Bird(Animal): def __init__(self): pass
執行Animal._init_
Dog.func
二、繼續使用人狗大戰的遊戲例子it
人類和狗類的相同屬性:name,blood,aggrclass
不一樣屬性:人類有sex,money,狗類有kind方法
它們的相同屬性能夠放在父類中,而不一樣的屬性放在各自類裏面,對相同屬性與不一樣屬性的操做以下:
class Animal: # 父類 # 子類擁有的共同屬性 def __init__(self,name,blood,aggr): # 狗和人在遊戲中擁有的共同屬性種類 self.name = name self.blood = blood self.aggr = aggr # 子類擁有的共同方法 def Eat(self): print('吃藥回血') self.blood += 100 class dog(Animal): # 子類 def __init__(self,name,blood,aggr,kind): # dog類擁有的屬性所有都傳進去,而且建立dog的self,只有本身的init文件中沒有的屬性纔會像父類尋求,即共同屬性是經過父類執行 Animal.__init__(self,name,blood,aggr) # 由於前面已經建立了dog本身的self,因此這裏的self就是dog這個對象,執行_init_文件的同時,並將狗的self傳入Animal中 self.kind = kind # 狗類的派生屬性,也就是不一樣於人類的屬性,也就是父類中不包括的屬性 def bite(self,someone): # 派生方法 someone.blood -= self.aggr # 下面的人類的有關分析與狗類的相同 class someone(Animal): # 子類 def __init__(self,name,blood,aggr,sex,money): Animal.__init__(self,name,blood,aggr) self.sex = sex # 人類的派生屬性,也就是不一樣於人類的屬性,也就是父類中不包括的屬性 self.money = money # 人類的派生屬性,也就是不一樣於人類的屬性,也就是父類中不包括的屬性 def attack(self,dog): # 派生方法 dog.blood -= self.aggr dog1 = dog('溜溜球',200,500,'泰迪') print(dog1.name) person1 = someone('王昭君',300,500,'girl',1000) print(person1.name) print(dog1.kind) print(person1.sex) print(person1.money) print(dog1.Eat()) print(person1.Eat()) print(person1.blood) print(dog1.blood)
運行結果:
溜溜球 王昭君 泰迪 girl 1000 吃藥回血 None 吃藥回血 None 400 300
三、小結
四、super關鍵字
super關鍵字只在新式類中使用,python3中全部類都是新式類,在使用super的方法調用執行父類的init文件的時候,不須要再傳self了:
class animal: # 父類 def __init__(self,name,blood,aggr): # 狗和人在遊戲中擁有的共同屬性種類 self.name=name self.blood=blood self.aggr=aggr class dog(animal): # 子類 def __init__(self,name,blood,aggr,kind): super().__init__(name,blood,aggr) # super方法調用執行父類的init文件,而且不用傳self,會自動將self傳進去,不像前面的Animal._init_的方法還須要傳self # super關鍵字的使用只在新式類中有,python3中全部類都是新式類 self.kind = kind # 派生屬性 def bite(self,someone): someone.blood-=self.aggr class someone(animal): # 子類 def attack(self,dog): dog.blood -=self.aggr dog1 = dog('溜溜球',200,500,'泰迪') print(dog1.name)
運行結果:溜溜球
因此在子類當中調用父類方法有: