1. 程式人生 > >python學習_day24_面向對象三大特性之繼承

python學習_day24_面向對象三大特性之繼承

wan 桌子 python super 特性 sub zhong 多重 family

一、繼承的定義

  繼承在python中是創建一種新類的方法,新建的類可以繼承一個或者多個父類,其中父類稱為超類或者基類,新建的類稱為派生類或者子類。繼承表達的是什麽是什麽的關系,如:高桌子低板凳都是木頭,他大舅他二舅都是他舅。

1、繼承實例

  如下例,定義了兩個類:Dog和Cat類,他們都其都有相同吃、喝、睡的特性。

#
class Dog:
    def eat(self):
        print(eating)
    def drink(self):
        print(drinking)
    def sleep(self):
        print
(sleeping) def say(self): print(汪汪汪) # class Cat: def eat(self): print(eating) def drink(self): print(drinking) def sleep(self): print(sleeping) def say(self): print(喵喵喵)

  因為以上兩類都有共同的方法,導致以上代碼存在較多重復代碼,因為以上兩個類都是動物,故可以建立一個動物類,用繼承的手段來創建這兩個子類。可以解決代碼的重復性。

class Animal:                              #超類、基類
    def eat(self):
        print(eating)
    def drink(self):
        print(drinking)
    def sleep(self):
        print(sleeping)
class Cat(Animal):                         #派生類、子類
    def say(self):
        print(喵喵)
class Dog(Animal):                         #派生類、子類
    
def say(self): print(汪汪) d=Dog() c=Cat() d.eat() c.eat()

2、繼承的分類

  繼承一般分為單繼承和多繼承,具體格式如下:

class ParentClass1:                            #定義父類
    pass

class ParentClass2:                            #定義父類
    pass

class SubClass1(ParentClass1):                 #單繼承,基類是ParentClass1,派生類是SubClass1
    pass

class SubClass2(ParentClass1,ParentClass2):    #python支持多繼承,用逗號分隔開多個繼承的類
    pass

  查看繼承父類的方法如下:

print(SubClass1.__base__#輸出結果:(<class ‘__main__.ParentClass1‘>,),__base__只查看從左到右繼承的第一個子類,__bases__則是查看所有繼承的父類
 print( SubClass2.__bases__#輸出結果:(<class ‘__main__.ParentClass1‘>, <class ‘__main__.ParentClass2‘>) 

二、繼承的應用

1、對象可以調用自己本類和父類的所有方法和屬性, 先調用自己的 自己沒有才調父類的。誰(對象)調用方法,方法中的self就指向誰

class A:
    def get(self):
        self.say()

    def say(self):
        print(AAAAA)

class B(A):
    def say(self):
        print(BBBBB)

b = B()
b.get()   #輸出結果為:BBBBB

2、如果要優先使用父類該方法的功能 需要借助super方法,實例如下:

class Animal:
    def __init__(self,name,food):
        self.name = name
        self.food = food
        self.family = 劉老師家
    def eat(self):
        print(%s 吃 %s%(self.name,self.food))
class Dog(Animal):
    def __init__(self,name):
        super().__init__(name, 狗糧)   #優先使用父類init方法
        self.family = 景弘家
    def swim(self):
        print(%s is swimming%self.name)
class Bird(Animal):
    def fly(self):
        print(%s is flying%(self.name))

teddy = Dog(熊二)                      #按照自己init方法要求穿參
好鳥 = Bird(花姑娘,蟲子)              #自己沒有init方法,按照父類傳參
teddy.eat()                             #熊二 吃 狗糧
teddy.swim()                            #熊二 is swimming
print(teddy.family)                     #景弘家
print(好鳥.family)                       #劉老師家

  經典類調用父類中的方法和新式類調用父類中的方法:

class Animal:
    def __init__(self,name):
        self.name = name

    def eat(self):
        print(%s eating %s%(self.name,self.food))
    def drink(self):
        print(drinking)
    def sleep(self):
        print(sleeping)

class Dog(Animal):
    def __init__(self,name):
        Animal.__init__(self,name)    #經典類的調用父類中方法的方式
        self.food = 狗糧
    def say(self):
        print(汪汪汪)

class Cat(Animal):
    def __init__(self,name):
        super().__init__(name)        #新式類調用父類中方法的方式,等價於super(Animal,self).__init__(name)
        self.food = 貓糧
    def say(self):
        print(喵喵喵)

wang = Dog(alex)
ha2 = Dog(二哈)
wang.eat()                      #alex eating 狗糧
ha2.eat()                       #二哈 eating 狗糧
c = Cat(egon)
c.eat()                         #egon eating 貓糧

3、派生屬性與派生方法實例

  當然子類也可以添加自己新的屬性或者在自己這裏重新定義這些屬性(不會影響到父類),需要註意的是,一旦重新定義了自己的屬性且與父類重名,那麽調用新增的屬性時,就以自己為準了。

class Animal:                        #父類 超類 基類
    def __init__(self,name,blood,aggr):
        self.name = name
        self.blood = blood
        self.aggr = aggr

    def eat(self):
        print(%s is eating % self.name)

class Person(Animal):                 #Person是子類
    def __init__(self, name, blood, aggr,RMB):
        super(Person, self).__init__(name,blood,aggr)
        self.qian=RMB

    def attack(self,dog):
        dog.blood -= self.aggr

class Dog(Animal):                     #Dog是子類
    def __init__(self, name, blood, aggr, pinzhong):
        super().__init__(name,blood,aggr)
        self.breed= pinzhong           #派生屬性

    def bite(self,person):             #派生方法
        person.blood -= self.aggr

alex  = Person(alex,250,12,1000000)                  
egg = Dog(egg,25000,20,金毛)                       

python學習_day24_面向對象三大特性之繼承