[轉載] Python類中的私有變量和公有變量

參考鏈接: Python中的私有變量

我們這里就直奔主題,不做基礎鋪墊,默認你有一些Python類的基礎,大家在看這篇博客的時候,如果基礎知識忘了,可以去菜鳥教程?

從一個簡單的類開始?

class A():? ? ? ?#定義一個類 A

? ? a? ? ?= 100? #公有變量

? ? _b? ? = 200? #公有變量

? ? __c? ?= 300? #私有變量

? ? __d__ = 400? #公有變量

a = A()? ? ?#實例化一個對象a,當然可以取另外一個名字b

print(a.a,a._b,a.__c,a.__d__)? ?#打印四個變量的值

?

運行結果: Traceback (most recent call last): File “c:\users\12090\desktop\a.py”, line 7, in? print(a.a,a._b,a.__c,a.d) AttributeError: ‘A’ object has no attribute ‘__c’?

?

??

? ?

??

?

運行結果,提示__c不能訪問,這里的錯誤信息,并沒有指出__c是私有變量,在類外不能訪問 我們程序這樣改動??

通過成員函數間接訪問私有變量?

?

a=A,和a=A()的區別?

我們把第8行改造一下: 去掉括號,就像這樣:??

a = A會成功生成對象a,而且通過對象a可以正確訪問到公有變量a,_b,d。但是在調用函數print_c()的時候,出問題,錯誤提示 TypeError: print_c() missing 1 required positional argument: ‘self’ 提示缺少參數,怎么解決這個問題呢: 顯示傳遞一個類,或者對象進去? 那么a=A,和a=A()有什么區別呢? 區別是: 如果是a=A,則不會調用類中的構造函數; 如果是a=A(),則會調用構造函數;?

A()會調用構造函數?

我們來做一個實驗, python中的構造函數名是系統規定的,init,添加后如下:?

class A():? ? ? ?#定義一個類 A

? ? a? ? ?= 100? #公有變量

? ? _b? ? = 200? #公有變量

? ? __c? ?= 300? #私有變量

? ? __d__ = 400? #公有變量

? ? def __init__(self):? ?#構造函數定義

? ? ? ? print('calling __init__....')

? ? def print_c(self):? #通過成員函數訪問私有變量

? ? ? ? return self.__c

a = A? ? ? ? ? #不會調用構造函數

print(a.a,a._b,a.print_c(a),a.__d__)

b = A()? ? ? ? #會調用構造函數? ?

print(b.a,b._b,b.print_c(),b.__d__)

?

運行結果:? 當我們通過A()這種形式構造對象的時候,會顯示調用構造函數__init__。 當我們通過A這種形式構造對象的時候,不會調用構造函數。?

構造函數,構造了什么?

“構造”這個詞,是一個動詞,就是要造一個東西,那么造什么呢,其實我們上面的例子,可能讓初學者有點不明所以,所以接下來,我們讓構造函數做點有意義的事情,程序如下:?

class A():? ? ? ?#定義一個類 A

? ? a? ? ?= 100? #公有變量

? ? _b? ? = 200? #公有變量

? ? __c? ?= 300? #私有變量

? ? __d__ = 400? #公有變量

? ? def __init__(self,a,b,c,d):? ?#通過構造函數給公有變量或者私有變量重新賦值

? ? ? ? print('構造前:',self.a,self._b,self.__c,self.__d__)

? ? ? ? self.a = a

? ? ? ? self._b = b

? ? ? ? self.__c = c

? ? ? ? self.__d__ = d

? ? ? ? print('構造后:',self.a,self._b,self.__c,self.__d__)

? ? def print_c(self):? #通過成員函數訪問私有變量

? ? ? ? return self.__c

a = A(1000,2000,3000,4000)? ? ? ? ? #通過傳值構造對象

?

運行結果:? 這個例子,就證明了構造函數的作用?

python中 self的作用?

self這個單詞是自己,自我的意思,它代表對象本身,其實你可以換一個單詞也可以,比如you??

照樣可以運行 甚至一個地方用self,一個地方用you也可以??

self的實際意義?

我們一般使用self,python系統也默認是self,但是self的作用遠不止單詞意思這么簡單 比如我們去掉self??

運行起來,好像也沒問題,但是這里的a,_b,__c,d(構造函數里面),并不是公有變量中的a,_b,__c,d。怎么見得呢? 我們把第七行打開? 運行結果出錯: Traceback (most recent call last): File “c:\users\12090\desktop\a.py”, line 13, in? a = A(1000,2000,3000,4000) #調用構造函數 File “c:\users\12090\desktop\a.py”, line 7, in init print(‘構造前:’,a,_b,__c,d) UnboundLocalError: local variable ‘_b’ referenced before assignment?

錯誤原因,是本地變量_b沒有引用,這個local是本地的意思,也就是在構造函數__init__函數作用范圍內。那么第7行的a為什么沒有報錯呢,因為a用的是參數里面的a,并不是公有變量中a。 所以,第12行的打印結果,其實打印的是局部變量,也就是說,在構造函數里面我們定義了一套與公有變量同名的變量,在這種情況下,局部變量優先。 所以,self其實非常有作用,必須通過self來顯示指定公有變量,不然會當作局部變量。 我們還可以進一步說明這個問題?

進一步證明?

?

結論?

Python類中公有變量和私有變量定義一般定義在類名下面,構造函數上面,比如這樣: class A: 公有變量 私有變量 def init(): 。。。 其中私有變量需要有前綴下劃線__ 如果成員函數(包括構造函數),中出現了與公有變量(私有變量)同名的變量,則python系統會屏蔽公有變量和私有變量,把改變量當成局部變量。如果要在成員函數(包括構造函數)使用公有變量和私有變量,必須通過self顯示指定,就像這樣: class A: a = 100 _b = 200 __c = 300 def init(self,a,b,c): self.a = a #使用公有變量a _b = b #屏蔽了公有變量_b,重新定義了一個局部變量_b self.__c =c #使用私有變量__c

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540546.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV探索之路(二十五):制作簡易的圖像標注小工具

搞圖像深度學習的童鞋一定碰過圖像數據標注的東西,當我們訓練網絡時需要訓練集數據,但在網上又沒有找到自己想要的數據集,這時候就考慮自己制作自己的數據集了,這時就需要對圖像進行標注。圖像標注是件很枯燥又很費人力物力的一件…

固件的完整形式是什么?

FW:前進 (FW: Forward) FW is an abbreviation of "Forward". FW是“ Forward”的縮寫 。 It is an expression, which is commonly used in Gmail or messaging platform. It is also written as FWD or Fwd or Fw. It shows that the email has been s…

[轉載] python __slots__ 詳解(上篇)

參考鏈接: Python的__name __(特殊變量) python中的new-style class要求繼承Python中的一個內建類型, 一般繼承object,也可以繼承list或者dict等其他的內建類型。 在python新式類中,可以定義一個變量__slots__,它的作…

委托BegionInvoke和窗體BegionInvoke

委托BegionInvoke是指通過委托方法執行多線程任務,例如: //定義委托成員變量 delegate void dg_DeleAirport(); //指定委托函數 dg_DeleAirport dga AirportBLL.DeleteHistoryTransAirport; //通過BeginInvoke以異步線程方式執行委托函數,可…

圖論 弦_混亂的弦

圖論 弦Problem statement: 問題陳述: You are provided an input string S and the string "includehelp". You need to figure out all possible subsequences "includehelp" in the string S? Find out the number of ways in which the s…

[轉載] Python列表操作

參考鏈接: Python中的基本運算符 Python列表: 序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推; Python有6個序列的…

「原創」從馬云、馬化騰、李彥宏的對話,看出三人智慧差在哪里?

在今年中國IT領袖峰會上,馬云、馬化騰、李彥宏第一次單獨合影,同框畫面可以說很難得了。BAT關心的走勢一直是同行們競相捕捉的熱點,所以三位大Boss在這次大會上關于人工智能的見解,也受到廣泛關注與多方解讀。馬云認為機器比人聰明…

python 注釋含注釋_Python注釋

python 注釋含注釋Python注釋 (Python comments) Comments in Python are used to improve the readability of the code. It is useful information given by the programmer in source code for a better understanding of code and logic that they have used to solve the …

C2的完整形式是什么?

C2:核心2 (C2: Core 2) C2 is an abbreviation of "Core 2" or "Intel Core 2". C2是“ Core 2”或“ Intel Core 2”的縮寫 。 It is a family of Intels processor which was launched on the 27th of July, 2006. It comprises a series of…

scala特性_Scala | 特性應用

scala特性特性應用 (Trait App) Scala uses a trait called "App" which is used to convert objects into feasible programs. This conversion is done using the DelayedInit and the objects are inheriting the trait named App will be using this function. T…

[轉載] Python3中的表達式運算符

參考鏈接: Python中的除法運算符 1:Python常用表達式運算符 yield 生成器函數send協議 lambda args:expression 創建匿名函數 x if y else z 三元選擇表達式(當y為真時,x才會被計算) x or y 邏輯或(僅但x為假時y才會被計算) x and …

字符串矩陣轉換成長字符串_字符串矩陣

字符串矩陣轉換成長字符串Description: 描述: In this article, we are going to see how backtracking can be used to solve following problems? 在本文中,我們將看到如何使用回溯來解決以下問題? Problem statement: 問題陳述&#xf…

pythonchallenge_level2

level2 地址:http://www.pythonchallenge.com/pc/def/ocr.html。 源碼:gitcode.aliyun.com:qianlizhixing12/PythonChallenge.git。 問題:找出頁面源碼一點提示注釋中的稀有字符。 #!/usr/bin/env python3 # -*- coding:UTF-8 -*-# Level 2im…

[轉載] python類運算符的重載

參考鏈接: Python中的運算符重載 alist input().split() blist input().split() n float(input()) class Vector: def __init__(self, x0, y0, z0): # 請在此編寫你的代碼(可刪除pass語句) self.X x self.Y y self.Z z # 代碼結束 def __add__(self, other):…

r語言 運算符_R語言運算符

r語言 運算符R語言中的運算符 (Operators in R Language) Generally speaking, an operator is a symbol that gives proper commands to the compiler regarding a specific action to be executed. The operators are used for carrying out the mathematical or logical cal…

[轉載] Python基礎之類型轉換與算術運算符

參考鏈接: Python中的運算符函數| 1 一、注釋 1.注釋:對程序進行標注和說明,增加程序的可讀性。程序運行的時候會自動忽略注釋。 2.單行注釋:使用#的形式。但是#的形式只能注釋一行,如果有多行,就不方便…

java awt 按鈕響應_Java AWT按鈕

java awt 按鈕響應The Button class is used to implement a GUI push button. It has a label and generates an event, whenever it is clicked. As mentioned in previous sections, it extends the Component class and implements the Accessible interface. Button類用于…

解決“由于應用程序的配置不正確,應用程序未能啟動,重新安裝應用程序可能會糾正這個問題”...

在VS2005下用C寫的程序,在一臺未安裝VS2005的系統上, 用命令行方式運行,提示: “系統無法執行指定的程序” 直接雙擊運行,提示: “由于應用程序的配置不正確,應用程序未能啟動,重新安…