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

day24 面向對象-繼承

back 結構 teacher opened font pla __main__ style 技術分享

什麽是繼承

繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類

繼承是類中提供的一種新語法
面向對象三大特性:封裝 繼承 多態
繼承:什麽是什麽的關系
他大舅打二舅都是他舅
高桌子低板凳都是木頭

繼承語法,單繼承和多繼承

class ParentClass1: #定義父類
    pass

class ParentClass2: #定義父類
    pass

class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
    pass
class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類 pass

查看繼承__bases__

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

提示:如果沒有指定基類,python的類會默認繼承object類,object是所有python類的基類,它提供了一些常見方法(如__str__)的實現。

繼承與抽象(先抽象,再繼承)

抽象即抽取類似或者說比較像的部分。

抽象分成兩個層次:

1.將奧巴馬和梅西這倆對象比較像的部分抽取成類;

2.將人,豬,狗這三個類比較像的部分抽取成父類。

抽象最主要的作用是劃分類別(可以隔離關註點,降低復雜度)

技術分享

繼承:是基於抽象的結果,通過編程語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。

抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類

技術分享

繼承與重用性

技術分享
#
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(喵喵喵)

#狗類和貓類都有 eat,drink,sleep 的方法,所有寫一個父類,讓子類繼承父類的這些方法

class Animal:        #父類、超類
    def eat(self):
        pass
    def drink(self):
        pass
    def sleep(self):
        pass
    

class Dog(Animal):   #子類、派生類  子類繼承父類的方法和屬性
    pass
class Cat(Animal):   #子類、派生類
    pass

dog = Dog()
cat = Cat()
dog.eat()
dog.drink()
dog.say()   #汪汪汪
cat.eat()
cat.drink()
cat.say()   #喵喵喵

print(Dog.__bases__)
使用繼承來解決代碼重用的例子

在開發程序的過程中,如果我們定義了一個類A,然後又想新建立另外一個類B,但是類B的大部分內容與類A的相同時

我們不可能從頭開始寫一個類B,這就用到了類的繼承的概念。

通過繼承的方式新建類B,讓B繼承A,B會‘遺傳’A的所有屬性(數據屬性和函數屬性),實現代碼重用

class Animal:
    ‘‘‘
    人和狗都是動物,所以創造一個Animal基類
    ‘‘‘
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵稱;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻擊力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

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

class Dog(Animal):
    pass

class Person(Animal):
    pass

egg = Person(egon,10,1000)
ha2 = Dog(二楞子,50,1000)
egg.eat()
ha2.eat()

派生

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

在繼承中
子類可以繼承父類的所有屬性和方法
但是 當父類和子類中有同名方法的時候 一定調用子類的
如果想使用父類該方法的功能 需要借助super方法

super

子類中執行父類的方法super()

class A:
    def hahaha(self):
        print(A)

class B(A):
    def hahaha(self):
        super().hahaha()  #調用父類中的hahaha()方法
        #super(B,self).hahaha()
        #A.hahaha(self)
        print(B)

a = A()
b = B()
b.hahaha()  #A B
super(B,b).hahaha() #A

實例一

技術分享
class Animal:
    def __init__(self,name,food):
        self.name = name
        self.food = food
    def eat(self):
        print(%s吃%s%(self.name,self.food))
    def drink(self):
        print(%s喝水%self.name)

class Dog(Animal):
    def __init__(self,name):    #子類對象初始化   實例化時只接受一個參數
        super().__init__(name,狗糧) #調用父類的__init__方法,需要傳入兩個參數  狗類的food就是狗糧
    def swim(self):
        print(在遊泳)
class Bird(Animal):
    def __init__(self,name):
        super().__init__(name,蟲子)
    def fiy(self):
        print(%s在飛%self.name)

gou = Dog(旺財)
gou.eat()
gou.drink()

niao = Bird(布谷鳥)
niao.fiy()
niao.eat()
niao.drink()
View Code

實例二

技術分享
class Animal:   #定義父類
    def __init__(self,name,blood,aggr):
        self.name =name
        self.blood = blood
        self.aggr = aggr
class Person(Animal):   #繼承父類Animal
    def __init__(self,name,blood,aggr,money):   #實例化一個人類時,要傳入4個參數
        super().__init__(name,blood,aggr)   #共有的屬性調用父類的__init__方法,傳入父類__init__要傳的參數
        self.money = money  #子類獨有的屬性
    def attack(self,dog):
        dog.blood -= self.aggr

class Dog(Animal):  #繼承父類Animal

    def bite(self,person):
        person.blood -= self.aggr

alex = Person(alex,2000,100,100000)
print(alex.money)   #100000
View Code

通過繼承建立了派生類與基類之間的關系,它是一種‘是‘的關系,比如白馬是馬,人是動物。

當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如教授是老師

>>> class Teacher:
...     def __init__(self,name,gender):
...         self.name=name
...         self.gender=gender
...     def teach(self):
...         print(teaching)
... 
>>> 
>>> class Professor(Teacher):
...     pass
... 
>>> p1=Professor(egon,male)
>>> p1.teach()
teaching

day24 面向對象-繼承