描述Python的變數聲明,可覷其語言設計思路,實現更快地代碼閱讀。 變數聲明 C# public、protect、private、internal 明確指出適用範圍 (完全公開、子類可訪問、僅自己可訪問、程式集內可訪問) Python 有點神奇,沒有不能訪問的變數,一般通過“潛規則”暗示其私有性 ...
描述Python的變數聲明,可覷其語言設計思路,實現更快地代碼閱讀。
變數聲明 |
|
C# |
|
public、protect、private、internal |
明確指出適用範圍 (完全公開、子類可訪問、僅自己可訪問、程式集內可訪問) |
Python |
|
有點神奇,沒有不能訪問的變數,一般通過“潛規則”暗示其私有性 Tips:下劃線underline,雙下劃線在一些論壇裡面就是double underline,簡稱dunder |
|
_var |
程式員潛規則,這是個私有變數,訪問改寫慎重 |
_funName 使用通配符導入(from myModule import * ),不可見 通配符導入模塊,不會導入單下劃線的名稱,除非重寫__all__ 使用名字導入(import myModule),可見 |
|
var_ |
避免和python解釋器的關鍵詞相撞的詞,例如class_ |
__var |
允許父類與子類有相同的名字並且相互獨立(子類該屬性不覆蓋父類) >>> class father: ... def __init__(self): ... self.__name = 'ff' ... self._test = 't' ... >>> class son(father): ... def __init__(self): ... super().__init__() ... self.__name = 'ss' ... self._id = '1' ... >>> s = son() >>> dir(s) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_father__name', '_id', '_son__name', '_test'] 名稱被改寫了,其實是為了防止被子類覆蓋。 (前雙劃線改寫名字適用於屬性與方法) |
這種前dunder改寫名字的特性,不受類束縛: >>> _MangledGobal__mangled = 11 >>> class MangledGobal(): ... def test(self): ... return __mangled ... >>> MangledGobal().test() 11 目前感覺隱藏坑還是有些多 |
|
__var__ |
解釋器內置方法,程式員應該避免這種命名 (以免與已有或者未來會有的內置方法相撞) |
_ |
臨時變數(用完就丟的意思) 在交互視窗中表示上一個語句的結果 |
self |
常見詞,以前我以為它就是C#里this的意思,雖然它也確實是; 但C#的this是固定(一個字母都不能變動)的關鍵詞, Python當中self可以不叫self,隨你起名(按照潛規則來說當然還是叫self穩妥),它只要在類的方法聲明中占據第一個參數位置就可以。 >>> class test: ... def __init__(dogee): ... dogee.name = 'dog' ... >>> test().name 'dog' 類里的方法聲明當中,預設第一個傳入參數就是實例對象,因為這個語法糖設計: >>> class test: ... def __init__(dogee): ... dogee.name = 'dog' ... def printName(doge): ... print(doge.name) ... >>> t = test() >>> test.printName(t) dog 這個語法糖看似雞肋,但從這個設計上就能明白self的設定。 註意,編程約定實例方法第一個入參是self |
cls |
類型本身也是一種對象,cls表示類型; 例如類方法,它的首個入參就不是實例對象,而是類對象: >>> class test: ... def __init__(dogee): ... dogee.name = 'dog' ... @classmethod ... def classMethod(cls): ... print(f'class method called, cls: {cls}') >>> test.classMethod() class method called, cls: <class '__main__.test'> >>> test().classMethod() class method called, cls: <class '__main__.test'>
|
吐槽:感覺寫短一點閱讀效果好些?~