感覺一個程式語言比較重要的部分已經快講完了,但也已經進行到三分之二了,今天來講一下怎麼定義Python的Claass,不過在這之前,希望大家對物件導向有一定程度的了解,由於Python是動態型別的語言,所以也不用定義Interface,自然而然就是個多型的概念XD,有好有壞啦,好處就是不用多寫一些程式,壞處就是少了一些約束,可能會造成一些錯誤或是需要再去確認型別等等,除了多型之外,還有封裝和繼承的概念,就從物件導向的原始概念來說,物件就是將一個概念封裝成一個Class,繼承就是這些概念的變化或是延伸,講的很抽像,不過這本來就是一個很抽像的東西,而怎麼實作一個類別也是沒有一定的標準答案,另外,有興趣的朋友,可以再去研讀一下SOLID這個物件導向的設計概念。
好了,掰完三百字了,再來帶一個簡單的Class的Example。
class Animal:
def eat(self):
print('eating')
class Cat(Animal):
def __init__(self, name):
self.name = name
self.tricks = [] # creates a new empty list for each dog
def add_trick(self, trick):
self.tricks.append(trick)
cat1 = Cat('Small White')
cat1.add_trick('eat')
cat1.add_trick('pee')
cat1.add_trick('sleep')
print(cat1.tricks)
cat1.eat()
一個還蠻簡單的Example,代出使用__init__為建構式,怎麼用class關鍵字定義類別,怎麼定義方法,和怎麼使用物件,比較特別的是使用帶self來指定這個物件實例來使用,有點小麻煩,不過,不用特別先去定義這個物件有那些屬性,又是另一個方便的地方。順便用Aniaml這個父類別來帶出怎麼使用繼承。
除了__init__為,Python也是內建了不少屬性來使用,可以參考這裏
另外,一些Python的類別的特色,也大概簡單來講一下,沒有private variable or method,靠的是__二條底線這個naming convention來告訴大家這件事。
再來,可以使用class variable這東西,所有的物件實例都可以去進去存取相同的值。然後如果需要使用類別方法或是靜態方法,需要使用一定特殊的註解。
class Cat(Animal):
# class variable
type = 'Black Cat'
def __init__(self, name):
self.name = name
self.tricks = [] # creates a new empty list for each dog
def add_trick(self, trick):
self.tricks.append(trick)
@classmethod
def m2(cls, n):
print("cls:", cls)
@staticmethod
def m3(n):
pass
至於class method和static method有何不同,可以看一下我的參考資料,簡單的說,就是一個有綁定類別對象一個沒有。
最後一點,Python是支援多重繼承的,這算是個雙刃劍就是了,至於如何解決相同命稱的Method衝突的問題,他是使用尋找的方式,當第一個繼承的類別找不到剛方法時,才會往上找,再來是找下一個繼承的類別這樣。
參考資料:
正确理解Python中的 @staticmethod@classmethod方法