自动将getter和setter应用于新的对象变量

时间:2014-12-07 11:55:16

标签: python

好吧,假设我有一个非常简单的类,即:

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的创建时间而不是类实例。

3 个答案:

答案 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