iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 20
0
自我挑戰組

Kaggle的解題挑戰 2018版系列 第 20

[Day20] Kaggle的解題挑戰 2018版 - Python Class

感覺一個程式語言比較重要的部分已經快講完了,但也已經進行到三分之二了,今天來講一下怎麼定義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方法


上一篇
[Day18] Kaggle的解題挑戰 2018版 - Python 條件運算子
下一篇
[Day21] Kaggle的解題挑戰 2018版 - Python Module
系列文
Kaggle的解題挑戰 2018版31

尚未有邦友留言

立即登入留言