python-class的聲明以及函數、變量屬性



# 1.類的設計以class 為關鍵詞,后面為類名,以及要集成的子類 ,一般一個類會包含一個init函數,用於完成初始化,然后是對於類的功能函數的設計
# 類定義了 __init__() 方法,類的實例化操作會自動調用 __init__() 方法。如下實例化類 MyClass,對應的 __init__() 方法就會被調用
# 變量在沒有默認值的時候可直接使用,不要聲明
1 class Complex:
2     def __init__(self, realpart, imagpart):
3         self.r = realpart
4         self.i = imagpart
5 
6 x = Complex(3.0, -4.5)
7 print(x.r, x.i)   # 輸出結果:3.0 -4.5
 
        
#   2.在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self, 且為第一個參數,self 代表的是類的實例。
# 類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。
# 從執行結果可以很明顯的看出,self 代表的是類的實例,代表當前對象的地址,而 self.class 則指向類。
1 class Test:
2     def prt(self):
3         print(self)
4         print(self.__class__)
5 
6 
7 t = Test()
8 t.prt()
#     self 不是 python 關鍵字,我們把他換成 runoob 也是可以正常執行的。
1 class Test:
2     def prt(runoob):
3         print(runoob)
4         print(runoob.__class__)
5 
6 
7 t = Test()
8 t.prt()
#   3 Python類中的 私有變量和私有方法
# 默認情況下,Python中的成員函數和成員變量都是公開的(public),在python中沒有類似public,private等關鍵詞來修飾成員函數和成員變量。
# 在python中定義私有變量只需要在變量名或函數名前加上 ”__“兩個下划線,那么這個函數或變量就是私有的了。
# 在內部,python使用一種 name mangling 技術,將 __membername替換成 _classname__membername,也就是說,類的內部定義中,
# 所有以雙下划線開始的名字都被"翻譯"成前面加上單下划線和類名的形式。
# 例如:為了保證不能在class之外訪問私有變量,Python會在類的內部自動的把我們定義的__spam私有變量的名字替換成為
# classname__spam(注意,classname前面是一個下划線,spam前是兩個下划線),因此,用戶在外部訪問__spam的時候就會
# 提示找不到相應的變量。 pytho n中的私有變量和私有方法仍然是可以訪問的;訪問方法如下:
# 私有變量:實例._類名__變量名
# 私有方法:實例._類名__方法名()

# 其實,Python並沒有真正的私有化支持,但可用下划線得到偽私有。 盡量避免定義以下划線開頭的變量!
# (1)_xxx "單下划線 " 開始的成員變量叫做保護變量,意思是只有類實例和子類實例能訪問到這些變量,
# 需通過類提供的接口進行訪問;不能用'from module import *'導入
# (2)__xxx 類中的私有變量/方法名 (Python的函數也是對象,所以成員方法稱為成員變量也行得通。),
# " 雙下划線 " 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據。
# (3__xxx__ 系統定義名字,前后均有一個“雙下划線” 代表python里特殊方法專用的標識,如 __init__()代表類的構造函數。

#     例子1 訪問私有變量
 1 class A(object):
 2     def __init__(self):
 3         self.__data = []  # 翻譯成 self._A__data=[]
 4 
 5     def add(self, item):
 6         self.__data.append(item)  # 翻譯成 self._A__data.append(item)
 7 
 8     def printData(self):
 9         print
10         self.__data  # 翻譯成 self._A__data
#     例子2 訪問私有方法 __dict__查詢類屬性 ,通過使用_classname__valuename 或者_classname__functionname 訪問私有變量或者方法
 1 class A():
 2     def __init__(self):
 3         self.__name = 'python'  # 私有變量,翻譯成 self._A__name='python'
 4 
 5     def __say(self):  # 私有方法,翻譯成 def _A__say(self)
 6         print
 7         self.__name  # 翻譯成 self._A__name
 8 
 9 
10 a = A()
11 # print a.__name #訪問私有屬性,報錯!AttributeError: A instance has no attribute '__name'
12 print(a.__dict__)  # 查詢出實例a的屬性的集合
13 print(a._A__name)  # 這樣,就可以訪問私有變量了
14 # a.__say()#調用私有方法,報錯。AttributeError: A instance has no attribute '__say'
15 print(dir(a))  # 獲取實例的所有屬性和方法
16 a._A__say()  # 這樣,就可以調用私有方法了
# 例子3 派生類和基類取相同的名字就可以使用基類的私有變量
 1 class A:
 2     def __init__(self):
 3         self.__name = 'python'  # 翻譯成self._A__name='python'
 4 
 5 
 6 class B(A):
 7     def func(self):
 8         print
 9         self.__name  # 翻譯成print self._B__name
10 
11 
12 instance = B()
13 # instance.func()#報錯:AttributeError: B instance has no attribute '_B__name'
14 print(instance.__dict__)
15 print(instance._A__name)

 








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM