iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
0

學習基礎OOP有關的(底線__)之後 就一起進入真正OOP程式設計~


OOP的主要設計有三種方法:封裝、繼承、多型。
當然真正『方法』可不只三種。但只要是有關OOP設計,基本上都要認識這三種型態,因為所有變化的原始概念都有<封裝、繼承、多型>。

封裝

之前介紹了閉包 也在前天談到_x的用法,而OOP封裝可看成這兩個優點結合體。
因為本身_x就有『隱密性』,而閉包觀念在OOP就可看成物件在其內部的方法(包括內部物件)被變成唯讀狀態。而在OOP這種用法因為模組化的關係變得更加明顯,就真的是把屬性跟方法鎖入class(類別)裡了。

封裝前(值可任意修改)

class print_number:
  def www(self, i=1):
    self.i = i
  def www_add(self):
    return (self.i)**500
    
d = print_number()
d.www()
print(d.www_add())
d.i = 5               #被任意修改
print(d.www_add())

這例子只是500次方 那如果是while判斷程式被輸入 可能導致無限迴圈呢...

封裝後(使用__x封裝)

class print_number:
  def www(self, i=1):
    self.__i = i
  def www_add(self):
    return (self.__i)**500 #__x用法
    
d = print_number()
d.www()
print(d.www_add())
d.__i = 0xABCDEFEDCBA987987 #有種修改我~~
print(d.www_add())

Out[ ]:1
		1

繼承

記得 第14天 為了介紹 __x 有用到繼承嗎?從上次的繼承程式可發現這用法就是把屬性作沿用。但特定方法__x就不行了,因為已經被定為唯一(私有)性,並不會繼承。
屬性一定可以繼承處理,但方法必須看定義性質

class jg:
    girla = 'alice'
    __girlb = "rebata" 
    def boyb(self):
        print(f'i like {self.girla}')
        print(f'i like {self.__girlb}')
#繼承 (jg)
class gd(jg):
    girla = 'joana'  #girlb方法被改變
    __girlb = "Andy" #私有方法只有屬性被繼承
    girlc = "123123"
    print("i like %s" %girlc)
gd().boyb()

Out[ ]:i like 123123
        i like joana
        i like rebata

所以繼承仍可自訂方法喔,只是它的屬性還是沿用舊的(也可建立新屬性)。新的class 就相當於上下屬關係。可讓程式別那麼籠統。
從這程式也可發現繼承是有先後順序的 因為不管什麼方法,物件還是最大的。調用順序為:

自身屬性,方法 > 外部方法 > 外部屬性


Ex:(做個輸入密碼套件)

if (__name__ == '__main__'): #調用套件時input不會執行 
    class bank(object):
        pwd = int(input('請輸入密碼'))
        def __init__(self, __acct , pwd): 
            self.acct = __acct
            self.pwd = pwd
            print(f'welcome~{self.acct}')
    #繼承
    class DB(bank):
        def code(self):
            print(f'pwd is {self.pwd}')

上一篇
[D15] OOP愛雙底線(調用)
下一篇
[D17] OOP之設計2
系列文
從寫程式到脫離菜雞的歷練(以python為主的資處與檔案權限)32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言