1. 程式人生 > >面向物件-三大特性

面向物件-三大特性

python面向物件程式設計三大特性

小結:前面我們說完了類和物件的關係,相信對類和物件的理解更加透徹..讓我們一起去研究面向物件的三大特性吧....

繼承

1.什麼繼承?

在程式中繼承就是事物之間的所屬關係.

2.繼承的語法: 單繼承 和多繼承

#單繼承
class A:pass
class B(A):pass  #B類繼承了A類  A為父類,B為子類
print(B.__bases__)  #  __bases__  檢視所有繼承的父類

#多繼承
class C:pass
class D:pass
class E(C,D):pass   # E類繼承了C,D兩個類,其中C,D 都是父類,E類是子類

A類 : 父類,也稱基類/超類.
B類:子類,也成派生類

3.父類和子類的關係

       1. 子類可以繼承父類的方法和屬性

常規繼承
class
Animal: def __init__(self,name,kind,languge): self.name = name self.kind = kind self.languge = languge def eat(self): print('%s is eattint'%(self.name)) def drink(self): print
('%s is drinking'%self.name) def yell(self): print('%s say %s'%(self.name,self.languge)) class Cat(Animal):pass class Dog(Animal):pass small_cat =Cat('small_cat','persian','mews') small_dog =Dog('small_dog','Huskil','yap') small_cat.yell() #Cat類沒有__init__方法,繼承父類中的屬性和方法,在Animal類找到init方法進行執行.
small_dog.drink() print(small_dog.name)

分析例項化執行流程: 以Cat類為例
1.首先先開闢一塊記憶體空間,並且記憶體空間有一個類指標,指向Cat,
2.然後執行init方法,在Cat中並沒有init方法,於是找Animal父類中init方法
3.將空間返回給small_cat

      2.如果子類也中擁有自己的屬性怎麼繼承呢?

class Animal:
    def __init__(self,name,kind,language):
        self.name = name
        self.kind = kind
        self.language = language
    def yell(self):
        print('%s say %s'%(self.name,self.language))
class Cat(Animal):   #子類中擁有自己的方法
    def climb(self):      # 派生方法
        print('%s can climb'%self.name)
class Dog(Animal):        # 派生方法
    def lookafter_door(self):
        print('%s can look after door'%self.name)
small_cat =Cat('small_cat','persian','mews')
small_dog =Dog('small_dog','Huskil','yap')

small_cat.climb()  #自己有方法用自己
small_dog.lookafter_door()  #同理

animal_1 = Animal('大金魚','','吐泡泡')
animal_1.climb()   # 父類呼叫子類的方法直接報錯

從中分析子類呼叫方法:1.子類有自己的方法就用自己,用了自己的就不可以用父類的
2.子類中沒有方法直接用父類的
           3.子類有個性化方法,單獨定義在子類中 -->派生方法
           4.子類可以呼叫父類,父類不能呼叫子類.


 

     3.子類和父類的方法相同又都想用怎麼辦?

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

    def sleep(self):
        print('%s 在睡覺'%self.name,)
class Cat(Animal):
    def climb(self):      # 派生方法
        print('%s can climb'%self.name)
    def sleep(self):
        Animal.sleep(self)    # 父類名,主動傳self  實現呼叫父類同名方法
        #super().sleep()     當然這種 super(self,Cat).方法名() 也可以
        print('團著睡')
small_cat =Cat('small_cat','persian','mews')
small_cat.sleep()   
 #如果需要既執行父類方法sleep,又要執行Cat類自己方法.達到特定的效果.就需要呼叫父類了

 總結:當某一個方法,父類和子類都擁有的時候,那麼在子類的方法中,呼叫父類的同名方法     1.父類名.方法名(self,...)     2.super().方法名(...)

4.為什麼有繼承?

    幾個類之間有重複的屬性和方法,把相同的屬性和方法都抽象出來,作為父類,子類取繼承父類. 為了解決類與類之間程式碼重複的問題.

          請看看示例程式碼:

#動物類
class Animal:
    def __init__(self,name,hp,ad):
        self.name = name
        self.hp = hp
        self.ad = ad
class People(Animal):
    def __init__(self, name, sex, hp, ad):
        super().__init__(name,hp,ad)
        self.sex = sex
    def attack(self,giant):
        print('%s發起了攻擊了%s'%(self.name,giant.name))
        giant.hp -= Sheldon.ad
        print('%s的HP剩餘%s' % (giant.name, giant.hp)) #
#怪獸類
class Monster(Animal):
    def __init__(self,name,kind,hp,ad):
        super().__init__(name,hp,ad)
        self.kind = kind
    def bite(self,Sheldon):
        print('%s撕咬了%s'%(self.name,Sheldon.name))
        Sheldon.hp -= giant.ad
        print('%s的HP剩餘%s'%(Sheldon.name,Sheldon.hp))
giant = Monster('giant','big',100,20)
Sheldon = People('sheldon','male',100,10)

Sheldon.attack(giant)
giant.bite(Sheldon)

 

.....