當前位置:首頁 » 編程語言 » python私有變數

python私有變數

發布時間: 2022-11-19 16:04:29

python 私有變數問題

前者showall是在父類外面,訪問父類的私有變數。當然會有錯。

後者showinfo是在show函數本身裡面訪問這個變數,沒有出show函數自己的范圍。當然也不會錯誤。

Ⅱ pyrhon中私有變數的理解與運用

9.6. 私有變數
只能從對像內部訪問的「私有」實例變數,在 Python 中不存在。然而,也有一個變通的訪問用於大多數 Python 代碼:以一個下劃線開頭的命名(例如 _spam )會被處理為 API 的非公開部分(無論它是一個函數、方法或數據成員)。它會被視為一個實現細節,無需公開。
因為有一個正當的類私有成員用途(即避免子類里定義的命名與之沖突),Python 提供了對這種結構的有限支持,稱為 name mangling (命名編碼) 。任何形如 __spam 的標識(前面至少兩個下劃線,後面至多一個),被替代為 _classname__spam ,去掉前導下劃線的 classname 即當前的類名。此語法不關注標識的位置,只要求在類定義內。
名稱重整是有助於子類重寫方法,而不會打破組內的方法調用。例如:
class Mapping:
def __init__(self, iterable):
self.items_list = []
self.__update(iterable)
def update(self, iterable):
for item in iterable:
self.items_list.append(item)
__update = update # private of original update() method
class MappingSubclass(Mapping):
def update(self, keys, values):
# provides new signature for update()
# but does not break __init__()
for item in zip(keys, values):
self.items_list.append(item)
需要注意的是編碼規則設計為盡可能的避免沖突,被認作為私有的變數仍然有可能被訪問或修改。在特定的場合它也是有用的,比如調試的時候。
要注意的是代碼傳入 exec(), eval() 時不考慮所調用的類的類名,視其為當前類,這類似於 global 語句的效應,已經按位元組編譯的部分也有同樣的限制。這也同樣作用於 getattr(), setattr() 和 delattr(),像直接引用 __dict__ 一樣。

Ⅲ python 變數下劃線命名規則

單下劃線和雙下劃線在Python變數、類、模塊命名中都有不懂的含義,名稱中都各有其含義。有一些是程序員之間約定俗成的,Python解釋器不用強制其執行,但有些Python解釋器會強制執行。

本文從以下幾種不同使用方式,對下劃線的用途和含義進行說明:

1)變數
通常用於類內部變數的命名,表明該變數是該類私用變數,外部不要去訪問它,但也是可以訪問到的。這只是程序員之間的一個約定俗成的做法,Python解釋器本身不會對它進行限制。
我們創建一個類:

實例化A,並訪問它的變數,aa._bar 也是可以訪問的,但既然人家這么命名了,外部最好不要去訪問了

2)函數和模塊
和變數一樣,這是一個私有函數,不建議外部程序調用該函數。
我們創建一個腳本aa.py, 裡面有2個函數 _aa,bb:

導入aa,分別調用函數 _aa和bb,bb 可以調用,但顯示無 _aa

3)類
同變數和函數一樣,都是私有變數,外部最好不要調用

用來避免和Python內置函數命名產生沖突,PEP8解釋了這個約定。
如class或def不能用作Python中的變數名稱,如果之間用,會提示錯誤。如果你非要用它,可以 使用 class_或 def_。
還有一些函數名,如chr,chr()是Python內置函數,用來表示ascii碼對應的字元他的輸入時數字,可以用十進制,也可以用十六進制。如果你非要它來表示染色體,可以用chr_來代替。當然如果你直接使用它作為變數名,它也不會報錯,但最好不要這樣使用。

在python中定義私有變數只需要在變數名或函數名前加上 "__" (兩個下劃線),那麼這個函數或變數就會成為私有的了。

在內部,python使用一種 name mangling 技術,將__var 替換成 _classname__var,因此在外部調用__var會找不到,代替它的是_classname_var。這種處理方式叫做名稱修飾(name mangling):解釋器更改變數的名稱,以便在類被擴展的時候不容易產生沖突。

由雙下劃線前綴和後綴包圍的變數,不會應用名稱修飾,因此不會被Python解釋器修改:
我們創建一個類B,dir() 查看類的所有屬性,發現 存在 __aa__

但是,Python保留了有雙前導和雙末尾下劃線的名稱,用於特殊用途。 如,__init__對象構造函數,或 __call__ 它使得一個對象可以被調用。所有我們盡量不要使用這種方式命名變數,以免和Python解釋器內置的函數發生沖突。

_ 不加任何其他字元,單獨作為一個名字,用來表示某個臨時的或者無關緊要的變數。

舉例1: 表示一個臨時變數 。在下面的循環中,我們不需要獲取循環的索引,只是print n 行 'Hello World',可以用 "_" 來表示它只是一個臨時值:

舉例2: 表示一個不關心的變數 ,僅僅是個佔位符變數,用來佔位。mlist 列表中,我只想獲得1,2,4 位的變數,那 3 和 5 可以 用 _ 來佔位

舉例3 : 表示由解釋器評估的最近一個表達式的結果 ,方便進行查看。

Ⅳ python 私有屬性與方法

一般來說,想訪問類成員變數,要麼用類訪問,要麼用實例訪問。實例訪問的是實例的副本,類訪問的是類的副本。
class A:
XXX = 0
def yy(self):
pass
A.XXX
或者,
a = A()
a.XXX
如果想從對象訪問類的副本,可以先拿到這個實例的類,再去訪問它的類成本
a.__class__.XXX
但你這個有點不一樣,你這個是類的私有成員變數,外面是無法訪問的(按照設計思路)。
一般穩健的方式是類的內部設置一個get()方法,調用get方法返回。
當然,如果你強行向訪問,可以這樣
a._A__XXX
但這種方法,訪問的仍然是對象自己的副本,不是類的
如果你想強行訪問,又想訪問的是類自己的副本,可以這樣
a.__class__._A__XXX
另外,找個好點的IDE吧,你這變數名字都拼錯了

Ⅳ python問題。 編程語言

你的意思是不是指如果 foo 這個函數里的 a 變數如果獲取到的是 True 的時候,要讓 foo 這個函數外面的傳入的變數的 b 值變成 False

如果是,那麼代碼如下(注意程序縮進):


a=False

b=True

def foo():

global a # 將變數提檔,使用公共變數而不是私有變數

global b

if a:

b=False

return '123'

if b:

return '456'

a=True

b=True

print(foo())

print('Now B is: ' + str(b))

主要問題是公共變數與私有變數的問題。


Ⅵ python 直接訪問私有變數不報錯

因為你這一句 c.__radius = 7 就相當於給c添加了一個公有變數 __radius

所有就會有這種現象,如果你按下面的代碼就會報錯

importmath
classCircle:
def__init__(self,radius):
self.__radius=radius
defgetRadius(self):
returnself.__radius
defsetRadius(self,radius):
self.__radius=radius

c=Circle(5)
#c.__radius=7
c.setRadius(7)
c.sd=8
print(c.__radius,c.getRadius())

Ⅶ python類里的私有變數如何定義

python沒有私有變數,任何定義的變數都是可以直接調用的,但是一般來說,在定義的變數前後加上兩個下劃線,把這樣的變數當成是私有變數,如下代碼所示:

classperson:
def__init__(self):
self.__private__=100
p=person()
print('__private__:',p.__private__)
print('p包含的變數:',dir(p))

輸出:

__private__:100
p包含的變數:['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__le__','__lt__','__mole__','__ne__','__new__','__private__','__rece__','__rece_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__']

Ⅷ python下劃線定義屬性

類的私有變數和私有方法

在Python中可以通過在屬性變數名前加上雙下劃線定義屬性為私有屬性

特殊變數命名

1、 _xx 以單下劃線開頭的表示的是protected類型的變數。即保護類型只能允許其本身與子類進行訪問。若內部變數標示,如: 當使用「from M import」時,不會將以一個下劃線開頭的對象引入 。

2、 __xx 雙下劃線的表示的是私有類型的變數。只能允許這個類本身進行訪問了,連子類也不可以用於命名一個類屬性(類變數),調用時名字被改變(在類FooBar內部,__boo變成_FooBar__boo,如self._FooBar__boo)

3、 __xx__定義的是特列方法。用戶控制的命名空間內的變數或是屬性,如init , __import__或是file 。只有當文檔有說明時使用,不要自己定義這類變數。 (就是說這些是python內部定義的變數名)

在這里強調說一下私有變數,python默認的成員函數和成員變數都是公開的,沒有像其他類似語言的public,private等關鍵字修飾.但是可以在變數前面加上兩個下劃線"_",這樣的話函數或變數就變成私有的.這是python的私有變數軋壓(這個翻譯好拗口),英文是(private name mangling.) **情況就是當變數被標記為私有後,在變數的前端插入類名,再類名前添加一個下劃線"_",即形成了_ClassName__變數名.**

Python內置類屬性

__dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)

__doc__ :類的文檔字元串

__mole__: 類定義所在的模塊(類的全名是'__main__.className',如果類位於一個導入模塊mymod中,那麼className.__mole__ 等於 mymod)

__bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)

Ⅸ python什麼是閉包 閉包的作用域

簡單說,閉包就是根據不同的配置信息得到不同的結果

再來看看專業的解釋:閉包(Closure)是詞法閉包(Lexical
Closure)的簡稱,是引用了自由變數的函數。這個被引用的自由變數將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法
認為閉包是由函數和與其相關的引用環境組合而成的實體。

python實例

看概念總是讓人摸不著頭腦,看幾個python小例子就會了

def make_adder(addend):
def adder(augend):
return augend + addend
return adder

p = make_adder(23)
q = make_adder(44)

print p(100)
print q(100)

運行結果:
123
144

分析一下:

我們發現,make_adder是一個函數,包括一個參數addend,比較特殊的地方是這個函數裡面又定義了一個新函數,這個新函數裡面的一個變數正好是外部make_adder的參數.也就是說,外部傳遞過來的addend參數已經和adder函數綁定到一起了,形成了一個新函數,我們可以把addend看做新函數的一個配置信息,配置信息不同,函數的功能就不一樣了,也就是能得到定製之後的函數.

再看看運行結果,我們發現,雖然p和q都是make_adder生成的,但是因為配置參數不同,後面再執行相同參數的函數後得到了不同的結果.這就是閉包.

Ⅹ python類的動態方法是否可以訪問到私有變數

classStudent(object):
def__init__(self,name,score):
self.__name=name;
self.__score=score;
self.__grade=3;##這是私有的屬性
self.grade=3;##這是公有的。

defshow_grade(self):
print("%s__grade=%d"%(self.__name,self.__grade));
print("%sgrade=%d"%(self.__name,self.grade));


lisa=Student("lisa",88);
mona=Student("mona",82);
defset_grade(self,grade):
self.__grade=grade;##實測發現,此函數調用後__grade還是原值。__grade是私有變數。只能被class里的「靜態方法」來修改。
self.grade=grade;##此函數調用後,grade的值被修改了。grade是公開變數。可以被動態方法來修改。
#print("%sgradeis%d"%(self.__name,self.grade));#在這里訪問不到self.__name,所以把此句注釋掉了。

Student.setGrade=set_grade;
lisa.setGrade(4);
lisa.show_grade();


結果如下:
lisa__grade=3
lisagrade=4

結論:
為類動態增加的方法,對類里私有屬性沒有讀與寫的許可權。

熱點內容
ea編程入門 發布:2025-01-15 13:30:11 瀏覽:411
應繳費檔次配置異常怎麼回事 發布:2025-01-15 13:20:34 瀏覽:617
成都php招聘 發布:2025-01-15 13:12:16 瀏覽:380
怎麼調用伺服器資料庫 發布:2025-01-15 13:06:25 瀏覽:656
人人網設置訪問許可權 發布:2025-01-15 13:02:06 瀏覽:563
崩壞學園2腳本 發布:2025-01-15 12:58:43 瀏覽:459
我的世界伺服器等級如何升 發布:2025-01-15 12:45:55 瀏覽:689
c語言程序填空題 發布:2025-01-15 12:45:53 瀏覽:545
怎麼配置氯化鈉濃度 發布:2025-01-15 12:34:06 瀏覽:206
4000除以125簡便演算法 發布:2025-01-15 12:27:41 瀏覽:464