Python 定義唯讀屬性的實現方式

2022-09-26 21:33:23 字數 2165 閱讀 4488

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 ...