1. 程式人生 > 程式設計 >Python中私有屬性的定義方式

Python中私有屬性的定義方式

Python沒有類似於Java的private關鍵字,但也可以為類定義私有屬性. 只需將屬性命名變為以__開頭,例如 __field.

示例程式碼:

class Vector2D(object):
  def __init__(self,x,y):
    self.__x = float(x)
    self.__y = float(y)
    self.xx = x
    self.yy = y 
  def get_x(self):
    return self.__x # 內部訪問
if __name__ == "__main__":
  v = Vector2D(3,4)
  print v.__dict__
  print v._Vector2D__x,v.get_x()# 但是可以通過v._Vector2D__x 在外部訪問
  v.__x # 外部訪問

輸出:

{'yy': 4,'xx': 3,'_Vector2D__x': 3.0,'_Vector2D__y': 4.0}
3.0 3.0
Traceback (most recent call last):
...
v.__x
AttributeError: 'Vector2D' object has no attribute '__x'

從上面的例子可以看出:

1. __field被編譯器重新命名為_className__field

2. 在class外部不能訪問obj.__field,但在class內部可以

3. 但是,這隻能防止無意間的呼叫,不能防止惡意呼叫,用Fluent Python的話來講,這是一種safety device,not security device,用國語來講,就是防君子不防xx,因為可以通過obj._className__field在外部訪問obj的私有__field.

補充知識:python中私有屬性和私有方法,修改私有屬性的值

如果一個屬性是以兩個下劃線開始 就標識這個這個屬性是一個私有屬性

self.__money = 1000000

如果一個方法是以兩個下劃線開始 也代表已經私有

子類繼承了父類 如果父類的屬性私有 將不會被子類繼承

私有屬性和私有方法可以在類的裡面使用

自定義類中 如果一個屬性進行了私有 在類的外面不能呼叫

修改私有屬性的值

如果需要修改一個物件的屬性值,通常有2種方法

物件名.屬性名 = 資料 ----> 直接修改

物件名.方法名() ----> 間接修改

私有屬性不能直接訪問,所以無法通過第一種方式修改,一般的通過第二種方式修改私有屬性的值:定義一個可以呼叫的公有方法,在這個公有方法內訪問修改。

class Person(object):
 
  def __init__(self):
    self.name = "小明"
    self.__age = 20
 
  #獲取私有屬性的值
  def get_age(self):
    return self.__age
 
  #設定私有屬性的值
  def set_age(self,new_age):
    self.__age = new_age
 
 
#定義一個物件
p = Person()
#強行獲取私有屬性
#崇尚一切靠自覺
print(p._Person__age)
print(p.name)
#想在類的外面獲取物件的屬性
ret = p.get_age()
print(ret)
 
#想在類的外面修改物件私有屬性的值
p.set_age(30)
print(p.get_age())

以上這篇Python中私有屬性的定義方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。