學習基礎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}')