[英]Automatically apply getter and setter to new object variable
好的,可以說我有一個非常簡單的類,即:
class Test(object):
pass
我想做的是定義一些默認的setter和getter方法,這些方法在創建時會自動應用於新的對象成員。 在下面的示例中,ax應該始終為大寫,即:
a = Test()
a.x = "foo"
print a.x
>>> FOO
如果我在類中創建x
,則將出現以下行為:
class Test(object):
def __init__(self):
self._x = ""
@property
def x(self):
return self._x
@x.setter(self, string):
self._x = string.upper()
那么有沒有可能沒有為每個成員定義setter和getter方法的情況呢? 非常感謝。
編輯:用創建時間,我的意思是不是類實例的ax
的創建時間。
最簡單的方法可能是覆蓋__setattr__
,並將任何字符串值更改為大寫:
>>> class Test(object):
def __setattr__(self, attr, val):
if isinstance(val, basestring):
val = val.upper()
super(Test, self).__setattr__(attr, val)
>>> t = Test()
>>> t.x = 'foo'
>>> t.x
'FOO'
將字典分類為子類;
In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class Struct(dict):
: """A dict subclass where you can simply use a dot to access attributes."""
:
: def __getattr__(self, name):
: return self[name]
:
: def __setattr__(self, name, value):
: self[name] = value
:--
In [2]: a = Struct()
In [3]: a.x = "foo"
In [4]: a.x
Out[4]: 'foo'
In [5]: a.length = 14
In [6]: a
Out[6]: {'length': 14, 'x': 'foo'}
這聽起來像是python Descriptor Proctocol的用例。
class WithDescriptors:
x = UpperCaseDescriptor()
y = UpperCaseDescriptor()
z = UpperCaseDescriptor()
class UperCaseDescriptor(object):
def __init__(self):
self.val = ''
def __get__(self, obj, objtype):
return self.val.upper()
def __set__(self, obj, val):
self.val = val
那只是一個大綱,我沒有測試代碼即可工作!
如果要將此類行為擴展到實例的每個屬性(即使不存在),則應考慮元類 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.