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

Python 自动将getter和setter应用于新对象变量,python,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 = ""

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

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

子类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'}
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'}

最简单的方法可能是重写
\uuuu setattr\uuuu
,并将任何字符串值更改为大写:

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

最简单的方法可能是重写
\uuuu setattr\uuuu
,并将任何字符串值更改为大写:

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

这听起来像是蟒蛇的一个用例

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

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

< P>这听起来像是Python的一个用例。

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

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

我原来是这样的,然后我想我开始过度思考:它在创建时自动地应用到一个新的对象成员…所以我在想,如果在
\uuuu init\uuuuu
中初始化的类属性/或属性应该不包含在大写字母中…也许我有点不清楚,我指的是新成员的创建时间,即“a.x”,对不起。我原来有这个,然后我想我开始想得太多了:在创建时会自动应用到一个新的对象成员。。。所以我在想,如果在
\uuuu init\uuuuu
中初始化的类属性/或属性应该不包含在大写字母中…也许我有点不清楚,我是指新成员的创建时间,即“a.x”,对不起。