1. 程式人生 > >python 私有屬性和私有方法

python 私有屬性和私有方法

一. 類的私有變數和私有方法

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

2》特殊變數命名

a. _xx 以單下劃線開頭的表示的是protected(受保護的) 型別的變數,即保護型別只能靠允許其本身與子類進行訪問。若內部變量表示,如:當使用“from M import” 時,不會將一個下劃線開頭的物件引入。

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

c. 私有變數例項:

#/usr/bin/python

#coding=utf-8

#@Time   :2017/11/7 8:40

#@Auther :liuzhenchuan

#@File   :類的私有變數.py

class A(object):

   '''類的私有變數和私有屬性'''

    _name = 'liuzhenchuan'

    __sex = 'F'

    def hello(self):

        print self._name

        print self.__sex

    def get_sex(self):

        return self.__sex

a = A()

#

print a._name

#私有變數 __sex 只能在類中被呼叫,例項化之前的部分是類中,單獨呼叫 a.__sex 報錯

# print a.__sex

#私有變數 __sex 可以在自己的方法中呼叫

a.hello()

#可以把私有變數定義一個方法,進行呼叫

print a.get_sex()

print '##'*5 + '子類' + '##'*5

class B(A):

    coller = 'yellow'

    def get_coller(self):

        return self.coller

b = B()

print b.coller

#父類中保護型別變數 _name 在子類中可以被呼叫

print b._name

>>>

liuzhenchuan

liuzhenchuan

F

F

##########子類##########

yellow

liuzhenchuan

二. python 中常用的私有變數

####python 中常用的私有變數:

  # __dict__ :類的屬性(包含一個字典,由類的資料屬性組成)

  # __doc__:類的文件字串

  # __module__: 定義所在的模組(類的全名是 '__main_.className',如果類位於一個匯入模組mymod中那麼className.__module__ 等於mymod)

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

print dir(a)

#['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',

# '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',

#  '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__',

# '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__',

#  '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__',

# '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split',

#  '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode',

# 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha',

# 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust',

# 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust',

# 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith',

#  'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

# __doc__ 可以打印出類裡的解釋說明

print (a.__doc__)

print (a.__class__)

print (a.__dict__)

>>>

['_A__sex', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_name', 'get_sex', 'hello']

類的私有變數和私有屬性

<class '__main__.A'>

{}