好吧,假设我有一个非常简单的类,即:
class Test(object):
pass
我想要做的是定义一些默认的setter和getter方法 在创建时自动应用于新对象成员。在下面的例子中,a.x应该总是大写的,即:
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方法的情况下这样做?非常感谢。
编辑:创建时间我的意思是a.x
的创建时间而不是类实例。
答案 0 :(得分:2)
最简单的方法可能是覆盖__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'
答案 1 :(得分:1)
字典ac;
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'}
答案 2 :(得分:1)
这听起来像是蟒蛇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
这只是一个大纲,我没有测试代码工作!
如果要将此类行为扩展到实例的每个属性, 即使哪些都不存在,你应该考虑metaclasses。