1. 程式人生 > >python類的繼承和多型,獲取物件資訊

python類的繼承和多型,獲取物件資訊

繼承

類的繼承機制使得子類可以繼承父類中定義的方法,擁有父類的財產,比如有一個Animal的類作為父類,它有一個eat方法:

class Animal(object):
    
    def __init__(self):
        print("Animal 建構函式呼叫!")
        
    def eat(self):
        print("Animal is eatting!")

寫兩個子類,Cat和Dog類,繼承自Animal類,宣告方法是在定義子類的時候在子類的括號內寫上父類Animal:
class Animal(object):
    
    def __init__(self):
        print("Animal 建構函式呼叫!")
        
    def eat(self):
        print("Animal is eatting!")
        
class Cat(Animal):
    
    def __init__(self):
        print("Cat 建構函式呼叫!")  
        
class Dog(Animal):
    
    def __init__(self,age):
        self.age=age
        print("Dog 建構函式呼叫!")

兩個子類中並沒有宣告任何方法,但是會自動繼承父類中的eat方法:
cat=Cat()
dog=Dog(3)

cat.eat()
dog.eat()

宣告兩個物件,呼叫eat方法,執行輸出:
Cat 建構函式呼叫!
Dog 建構函式呼叫!
Animal is eatting!
Animal is eatting!

一般把一些共有的方法定義在基類中,其他繼承自該基類的子類就可以自動擁有這個方法。

多型

在繼承的基礎上,就引入了類的另外一個重要的特性——多型。

考慮一個問題,子類可以繼承父類的方法,那子類是否可以實現自己的這個方法呢,答案是可以的。

class Animal(object):
    
    def __init__(self):
        print("Animal 建構函式呼叫!")
        
    def eat(self):
        print("Animal is eatting!")
        
class Cat(Animal):
    
    def __init__(self):
        print("Cat 建構函式呼叫!")
        
    def eat(self):
        print("Cat is eatting!")
        
class Dog(Animal):
    
    def __init__(self,age):
        self.age=age
        print("Dog 建構函式呼叫!")
        
    def eat(self):
        print("年齡是"+str(self.age)+"歲的Dog is eatting!")
        
cat =Cat()
cat.eat()

dog=Dog(3)
dog.eat()

子類如果也定義了自己的實現,就會優先呼叫自己的實現,上邊cat和dog呼叫eat方法就分別是自己的實現,執行輸出:
Cat 建構函式呼叫!
Cat is eatting!
Dog 建構函式呼叫!
年齡是3歲的Dog is eatting!

多型意味著一個介面,多種實現,另一個可以體現類的多型這種特性的例子:
def eat(animal):
    if hasattr(animal,'eat'):
        animal.eat()
    if hasattr(animal,'age'):
        a=getattr(animal,'age')
        print('animal的年齡是'+str(a)+'歲')
            
eat(dog)

這裡定義了一個普通函式eat,函式的入參是類的物件,具體實現是呼叫傳入的物件的eat方法,傳入不同的物件,就有不同的輸出,呼叫的時候只要呼叫這個介面就可以了,而不用管具體的細節。

執行輸出:

年齡是3歲的Dog is eatting!
animal的年齡是3歲


獲取物件資訊

hasattr(object , 'name')

說明:判斷物件object是否包含名為name的屬性或方法,如果有則返回True,沒有則返回False

getattr( object, 'name')

說明:獲取物件object中名稱為name的屬性,返回name的值。

對類中方法的呼叫,可以先用hasattr判斷是否存在該方法,然後再呼叫這個方法,避免異常:

class Animal(object):
    
    def __init__(self):
        print("Animal 建構函式呼叫!")
        
    def eat(self):
        print("Animal is eatting!")
 
def eat(animal):
    
    if hasattr(animal,'eat'):
        animal.eat()
    if hasattr(animal,'age'):
        a=getattr(animal,'age')
        print('animal的年齡是'+str(a)+'歲')
        
    if hasattr(animal, 'sleep'):
        animal.sleep()
    else:
        print('animal類中不含有sleep方法!')

animal=Animal()        
eat(animal)

執行輸出:
Animal 建構函式呼叫!
Animal is eatting!
animal類中不含有sleep方法!