1. 程式人生 > >Python基礎10 面向物件(下)

Python基礎10 面向物件(下)

作者:玉樹【林】風

歡迎轉載,也請保留這段宣告。

繼承

在現實世界中,不同的類之間可能存在某種從屬關係。

例如:貓和狗都屬於哺乳動物,貓和狗都有2隻眼睛、4個腳、1個尾巴,也能夠吃飯、睡覺、發出叫聲。只是貓的叫聲和狗的叫聲不同。

那麼我們先定義一個哺乳動物類。

# encoding=utf-8

class Mammal:
    eyes = 2 
    legs = 4 
    tail = 1 

    # 吃東西
    def eat(self): 
        print('eating!')
    
    # 睡覺
    def sleep(self): 
        print('sleeping!')
    
    # 發出叫聲
    def cry(self):
        pass

這裡可以發現,貓和狗除cry的方法不同外,其他屬性和行為都相同,那麼我們利用繼承的方式,就不需要重新定義這些相同的屬性和方法了。

class Dog(Mammal):
    pass

class Cat(Mammal):
    pass

Tom = Cat()
Odd = Dog()

print('Tom has %d eyes' % Tom.eyes)
print('Odd has %d eyes' % Odd.eyes)
Tom.eat()
Odd.eat()

輸出為

Tom has 2 eyes
Odd has 2 eyes
eating!
eating!

可以發現,Mammal的子類Cat和Dog都可以呼叫父類的方法,並獲得父類的屬性。

方法重寫

剛剛我們新建了Cat類和Dog類,各自集成了Mammal類,分別擁有了哺乳動物的基本屬性和行為。但是對於cry這個方法,貓和狗是不一樣的。

Mammal類中cry方法體為pass,即方法為空。

我們可以使用方法重新的辦法將貓和狗的cry方法進行重寫,使貓和狗有各自不同的叫聲。

# encoding=utf-8

class Dog(Mammal):
    def cry(self):
        print('汪汪')

class Cat(Mammal):
    def cry(self):
        print('喵')

Tom = Cat()
Tom.cry()
Odd = Dog()
Odd.cry()
輸出為
喵
汪汪

通過方法重寫,我們就使Mammal的子類貓和狗擁有了各自不同的叫聲。

私有屬性及私有方法

為了類能夠被安全的呼叫,Python提供了一套屬性、方法私有的方式,防止類中不對外公開的屬性和方法被外部訪問。

我們只需要在定義的變數或方法前加2條下滑線(如:__param_name、__func)即可。

# encoding=utf-8

class fruit:
    __private_param = '私有屬性'

    def __private_func(self):
        print('私有方法')

f = fruit()
print(f.__private_param)
f.__private_func()

啟動後報錯,報錯資訊如下

AttributeError: 'fruit' object has no attribute '__private_param'

如果將第8行程式碼註釋掉,報錯資訊如下

AttributeError: 'fruit' object has no attribute '__private_func'

當我們將屬性或方法定義為私有、通過例項物件的方式就無法直接訪問了,只能在類的內部訪問。

總結

這節課我們將面向物件的剩餘部分講解完畢,主要內容包括:

類的整合

方法的重寫

私有屬性和私有方法的使用