2019年2月1日 星期五

Python 與 物件導向三大特性


Python本身就是物件導向的程式語言,

說到物件導向就不能不提到其有名的三大特性,

今天就簡單來闡述下

Python 與 物件導向三大特性


物件導向的三大特性分別是


  • 封裝
  • 繼承
  • 多型


封裝

簡單的說將同一類或者同一物的資料與運算打包起來,

就稱之為封裝


以Python為範例,

上面建立了一個矩形類別

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        print("area = ", self.length*self.width)

    def Perimeter(self):
        print("perimeter = ", 2*(self.width+self.length))

要求矩形的周長與面積,

如果以函式的話,

勢必得要有兩次長度與寬度的資料傳入函式,

而封裝起來的物件,

僅需要直接調用定義的方法(Method)即可

myrectangle = Rectangle(4, 2)
myrectangle.area()
myrectangle.Perimeter()



繼承

則是將多個類別的相似處設為一個基礎類別,

各類別再針對個別特性從基礎類別去做延伸,

以貓狗為例子,

class Cat:
    def __init__(self, name):
        self.name = name

    def jumps(self):
        print("jump")

    def runs(self):
        print("run")

    def shout(self):
        print("my name is " + self.name + " meow ")

將定義其跑,跳,叫聲的類別以Python寫出來如上,

同樣在定義狗的時候,

卻重複了跑與跳,

寫兩次雖說不是不可以,

但這就是多餘的,

更何況若有多個類似物件,

重複的步驟可就多了,

這時候就可利用繼承方式將不一樣的挑出來

class Pet:
    def __init__(self, name):
        self.name = name

    def jumps(self):
        print("jump")

    def runs(self):
        print("run")


class Dog(Pet):
    def shout(self):
        print("my name is " + self.name + " bow-wow ")


class Cat(Pet):
    def shout(self):
        print("my name is " + self.name + " meow")

由於貓與狗只有叫聲不同,

將跑與跳定義為Pet類別,

在定義貓與狗時,

分別繼承Pet類別即可


多型

mycat = Cat("May")
mydog = Dog("Lucky")

mycat.shout()
mydog.shout()

多型讓子類別(貓與狗)呼叫同名的方法(Method      shout)時

呈現各子類別不同之處(貓叫與狗吠)

即有名的   duck typing,

"走路像鴨子,叫聲像鴨子,那它就是鴨子"


例如牛也能有叫聲,

它僅需要在類別中定義shout方法即可

也就是說不在乎是哪一種物件呼叫了同名方法,

只需要該物件有定義此同名方法就好了


沒有留言: