Python中对象名称前单下划线和双下划线有啥区别
單下劃線
在一個類中的方法或屬性用單下劃線開頭就是告訴別的程序這個屬性或方法是私有的。然而對于這個名字來說并沒有什么特別的。
引自PEP-8:
單下劃線:"內部使用"的弱指示器。比如,from M import * 將不會引進用但下劃線開頭的對象。
雙下劃線
來自Python文檔:
任何__spam形式(至少兩個下劃線開頭,至多一個下劃線結尾)都是代替_classname__spam,其中classname是當前類的名字。This mangling is done without regard to the syntactic position of the identifier。所以它能用來定義私有類的實例和類變量,方法,在全局中的變量,甚至是實例中的變量??梢詤^別不同類的實例。
例子
class MyClass(): def __init__(self): self.__superprivate = "Hello" self._semiprivate = ", world!" ... mc = MyClass() print mc.__superprivate Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: myClass instance has no attribute '__superprivate' print mc._semiprivate , world! print mc.__dict__{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
總結:
__foo__:一種約定,Python內部的名字,用來區別其他用戶自定義的命名,以防沖突。
_foo:一種約定,用來指定變量私有。程序員用來指定私有變量的一種方式。
__foo:這個有真正的意義:解析器用_classname__foo來代替這個名字,以區別和其他類相同的命名。
在Python中沒有其他形式的下劃線了。
這種約定方式和類,變量,全局變量等沒有區別。
_name 不能用'from moduleimport *'導入?
__name__ 系統定義名字?
__xxx 類中的私有變量名
1、_name 不能用于’from module import *’ 以單下劃線開頭的表示的是protected類型的變量。即保護類型只能允許其本身與子類進行訪問。
2、__name 雙下劃線的表示的是私有類型的變量。只能是允許這個類本身進行訪問了。連也是子類也不可以的。
3、name_?定義的是特列方法。像init、del之類。
總結
以上是生活随笔為你收集整理的Python中对象名称前单下划线和双下划线有啥区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python-mysql超简单银行转账
- 下一篇: 4.搭建主从