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



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

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()

那么是否有可能在不为每个成员定义二传手和吸气手方法的情况下做到这一点呢?多谢。

编辑:创建时间是指a.x而不是类实例的创建时间。

最简单的方法可能是覆盖__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'

子类 a dict;

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描述符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

这只是一个大纲,我没有测试代码才能工作!

如果要将此类行为扩展到实例的每个属性,即使不存在元类,也应该考虑元类。

最新更新