python是物件導向(oop)的語言, 而且在oop這條路上比j**a走得更徹底, 因為在python裡, 一切皆物件, 包括int, float等基本資料型別.
在j**a裡, 若要為乙個類定義唯讀的屬性, 只需要將目標屬性用private修飾, 然後只提供getter()而不提供setter(). 但python沒有private關鍵字, 如何定義唯讀屬性呢? 有兩種方法, 第一種跟j**a類似, 通過定義私有屬性實現. 第二種是通過__setattr__.
通過私有屬性
python裡定義私有屬性的方法見
用私有屬性+@property定義唯讀屬性, 需要程式設計客棧預先定義好屬性名, 然後實現對應的getter方法.
class vector2d(object):
def __init__(self, x, y):
self.__x = float(x
self.__y = float(y)
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
if __name__ == "__main__":
v = vector2d(3, 4)
print(v.x, v.y)
v.x = 8 # error will be raised.
輸出:(3.0, 4.0)
traceback (most recent call last):
file ...., line 16, in
v.x = 8 # error will be raised.
attributeerror: can't set attribute
可以看出, 屬性x是可讀但不可寫的.
通過__setattr__
當我們呼叫obj.attr=value時發生了什麼?
很簡單, 呼叫了obj的__setattr__方法. 可通過以下**驗證:
class mycls()
def __init__(self):
pass
def __setattr__(self, f, v):
print 'setting %r = %r'%(f, v)
if __name__ == '__main__':
obj = mycls()
obj.new_field = 1
輸出:setting 'new_field' = 1
所以呢, 只需要在__setattr__ 方法裡擋一下, 就可以阻止屬性值的設定, 可謂是釜底抽薪.
**:luzpwxs
# encoding=utf8
class mycls(object):
readonly_property = 'readonly_property'
def __init__(self):
pass
def __setattr__(self, f, v):
if f == 'readonly_property':
raise attributeerror('{}.{} is read only'.\
format(type(self).__name__, f))
else:
self.__dict__[f] = v
if __name__ == '__main__':
obj = mycls()
obj.any_other_property = 'any_other_property'
print(obj.any_other_property)
print(obj.readonly_property)
obj.readonly_property = 1
輸出:any_other_property
readonly_property
traceback (most recent call last):
file "...", line 程式設計客棧21, in
obj.readonly_property = 1
...attributeerror: mycls.readonly_property is read only
本文標題: python 定義唯讀屬性的實現方式
本文位址:
怎麼實現唯讀屬性
方法一 物件私有化 usr bin env python coding utf 8 author jia shilin class person object def init self,x self.age 20 def get age self return self.age a person ...
C 實現磁碟去唯讀屬性
磁碟去唯讀屬性也是有兩種方法,一種是diskpart工具的 attributes disk clear readonly 命令,還有一種是執行wmi的帶引數方法。關於如何寫c 呼叫diskpart工具和c wmi在前面兩篇文章 c 實現磁碟聯機 和 c 實現磁碟初始化中都提及到了。直接附上 1.di...
C 中使用 實現唯讀屬性
今天在閱讀unity的fps microgame原始碼時,發現了以下奇怪的語句 public gameobject knowndetectedtarget m detectionmodule.knowndetectedtarget public bool istargetinattackrange ...