day24 02 單繼承(派生)

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)

運行結果:溜溜球

因此在子類當中調用父類方法有:

  • 父類名.方法名:須要本身傳self參數
  • super().方法名:不須要本身傳self參數
相關文章
相關標籤/搜索