昨天談到了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)
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
這個用法可以隱藏一些調整或測試函數 避免使用者直接使用它
注意:它只適合隱藏其代碼內的函數 但開發者已知的函數,仍可調用
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()
之後執行會花生奇怪的事~~
原來是因為其函數被隱藏,引入其物件名稱就ok了
這個就要討論還沒講的『繼承』跟『封裝』觀念。意思是當一個物件被賦予其屬性後,其值不可延續,且必須尊崇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 具有唯一性,無法被修改