1. 程式人生 > >Python中的多型與繼承

Python中的多型與繼承

Python能夠實現與C++/Java等面向物件程式設計的多型與繼承方法。

Python的所有方法都是虛擬的,如果重新實現基類中的一個方法,則該重新實現的方法則會是被呼叫的方法。

1. 建立基類 Item

class Item(object):
    def __init__(self, artist, title, year=None):
        self._artist=artist
        self._title=title
        self._year=year
2.在基類函式中需要有建立存取器(accessor):
    def artist(self):
        return self._artist
    def setAtist(self,artist):
        self._artist=artist

    def title(self):
        return self._title
    def setTitle(self,title):
        self._title=title

    def year(self):
        return self._year

    def setYear(self,year):
        self._year=year
3、建立類中的其他方法:
    def _str_(self):
        year=""
        if self._year is not None:
            year="in %d" %self._year
        return "%s %s by %s" % (self._artist ,self._title, self._year)
4、建立基類Item的一個子類Painting:
class Painting(Item):
    def __init__(self ,artist, title, year):
        super(Painting,self).__init__(artist, title, year)
在子類Painting中還沒有其他的資料屬性或者新的方法,super作為其中的一個內建函式,可以用來初始化Item的資料與方法。super()函式帶有一個類,並可以返回該類的基類。如果基類函式中沒有資料需要進行初始化,則不需要呼叫super函式。

5、繼續建立一個更加複雜的子類Sculpture

class Sculpture(Item):
    def __init__(self, artist, title, year=None, material=None):
        super(Sculpture, self).__init__(artist, title, year)
        self._material=material
    def _str_(self):
        materialSring=""
        if self._material is not None:
            materialSring="in %s" %self._material
        return "%s %s by %s" % (super(Sculpture, self)._str_(),materialSring)
在Sculpture中建立了一個額外的屬性material。在_str_方法中呼叫了基類的方法。在呼叫基類方法時_str_()中不能新增self否則,程式將會不斷重複遞迴呼叫_str_()函式。這麼使用保證了函式一定能夠呼叫到_str_函式,這也是有Python的多型性決定的。