1. 程式人生 > >python 類的私有變量和私有方法

python 類的私有變量和私有方法

所有 成員 就是 變量 屬性變量 author 類的屬性 其他 一個

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time   : 2017/11/08 8:46
# @Author : lijunjiang
# @File   : class3.py
"""
類的私有變量和私有方法
在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__ :類的文檔字符串
__module__: 類定義所在的模塊(類的全名是‘__main__.className‘,如果類位於一個導入模塊mymod中,那麽className.__module__ 等於 mymod)
__bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)
""" class pub(): _name = protected類型的變量 __info = 私有類型的變量 def _func(self): print("這是一個protected類型的方法") def __func2(self): print(這是一個私有類型的方法) def get(self): return(self.__info) a = pub() print(a._name) a._func() # print(a.info) # 執行結果: # protected類型的變量
# 這是一個protected類型的方法 # protected類型的變量和方法 在類的實例中可以獲取和調用 # # print(a.__info) # # a.__func2() # 執行結果: # File "D:/Python/class/class3.py", line 46, in <module> # print(a.__info) # # AttributeError: pub instance has no attribute ‘__info‘ # a.__func2() # AttributeError: pub instance has no attribute ‘__func2‘
# 私有類型的變量和方法 在類的實例中獲取和調用不到 # 獲取私有類型的變量 print(a.get()) # 執行結果:私有類型的變量 # 如果想要在實例中獲取到類的私有類形變量可以通過在類中聲明普通方法,返回私有類形變量的方式獲取 print(dir(a)) # 執行結果:[‘__doc__‘, ‘__module__‘, ‘_func‘, ‘_name‘, ‘_pub__func2‘, ‘_pub__info‘, ‘get‘] print(a.__dict__) # 執行結果:{} print(a.__doc__) # 執行結果: None print(a.__module__) # 執行結果:__main__ print(a.__bases__) # 執行結果: # print(a.__bases__) # AttributeError: pub instance has no attribute ‘__bases__‘

python 類的私有變量和私有方法