iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0

昨天談到了class與def,雖然python可謂『萬般皆物件』,但其變數底線的特性仍會影響整個物件的性質,而底線可不是只有避免名稱混雜或衝突那麼簡單。


底線的意義

它代表著無名或未知的感覺(但不代表不存在)。像下面這個用法,當程式複雜時就可以用底線來代替一次性變數:
Ex:(避免跟i打架)

i = ~0x15
for _ in range(0,15):
    b = int(input('block'))
    if b == 135:
        print(b)
    else:
        print(b-i)
  • 補充:lambda(無名函式)
    那只有變數有匿名的性質嗎?當然不只,函式也可以為了避免『打架』使出一樣的功能。用完即丟,多用在處理簡單的函式運算 但不能濫用 否則會變成麵條(難讀寫)程式~
a = lambda x : x-x+x
b = lambda y , z : (y+3)/3*z
print(a(-3)) 
print(b(15 , 16))

Out[ ]:-3
		96.0

_x的特性

這個用法可以隱藏一些調整或測試函數 避免使用者直接使用它
注意:它只適合隱藏其代碼內的函數 但開發者已知的函數,仍可調用
Ex:(體驗_x的隱藏性)

#QwQ.py
def a():
        print("i am A")
def b():
        print('i am B')
def _c():
        print('watch out!!!')
'''
'''
#test.py
from QwQ import *
a()
b()
_c()

之後執行會花生奇怪的事~~
https://ithelp.ithome.com.tw/upload/images/20190916/20117399YKAp7H3z00.png
原來是因為其函數被隱藏,引入其物件名稱就ok了
https://ithelp.ithome.com.tw/upload/images/20190916/20117399PVjr0AAJbH.png

__x的特性

這個就要討論還沒講的『繼承』跟『封裝』觀念。意思是當一個物件被賦予其屬性後,其值不可延續,且必須尊崇class 所給的屬性。封裝則是把方法鎖在class裡無法被更改。
__x主要代表著其物件具有私有性(private)。定義的值基本上無法被修改,這方法也是OOP最常用底線之一:

class jg:
    __girla = 'comoco'
    girlb = 'alice'
    def boya(self):
        print(f'fxxk{self.__girla}')
    def boyb(self):
        print(f'i like {self.girlb}')
#繼承 (jg)
class gd(jg):
    __girla = 'ccccc'
    girlb = 'joana'
###
jg().boya()
jg().boyb()
gd().boya()
gd().boyb()

整理:
_xx 隱藏此物件,不輕易被使用
__xx 具有唯一性,無法被修改


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

尚未有邦友留言

立即登入留言