【问题标题】:Python: looking for a short-hand way to setup setters/getters for lots of variablesPython:寻找一种快捷方式来为大量变量设置 setter/getter
【发布时间】:2017-08-11 19:37:57
【问题描述】:

我有一个类(Bar)嵌入到另一个类(Foo)中。

class Foo():
    class Bar():
        def __init__(self):
            self.a = 1
            self.b = 2
            ...
            self.z = 26


    def __init__(self):        
        self.bar = Bar()

要访问 Bar 类的属性,用户需要执行以下操作:

>>> f = Foo()
>>> f.bar.a
1

如何设置短点符号以便用户可以同时使用:

>>> f.bar.a
1

>>> f.a
1

在我的示例中,我试图证明 Bar 类有很多变量。所以我不想手动为每个人写一个getter/setter。所以我想在这样的 for 循环中使用 property():

def __init__(self):
    self.bar = Bar()

    # Allow shorter dot notation
    for parm in self.bar.__dict__:
         setattr(self, i, getattr(bar, i))
         self.i = property(...)

但我不确定如何在不手动编写几个 setter 函数的情况下在这种情况下使用属性。

关于如何允许访问更短和更长的符号有什么建议吗?

【问题讨论】:

  • 您的示例中的类在 Python 2 上没有显式继承自 object 或任何其他新式类。这将产生 旧式类,一个旧的,更糟糕​​的系统,有很多奇怪的不兼容性,只是因为一些旧代码依赖于这种行为而保留下来。除非你真的需要保留旧的行为,否则不从其他任何东西继承的类应该显式地从 Python 2 上的object 继承。

标签: python python-2.7 data-structures


【解决方案1】:

这就是__getattr__hook 的理想选择:

class Foo:
    # ...

    def __getattr__(self, name):
        return getattr(self.bar, name)

__getattr__ 仅对缺少的属性调用;所以只有Foo() 实例上不存在的属性才会传递给Foo().__getattr__()。然后getattr() function 允许您在self.bar 上使用相同的属性名称;如果该属性也不存在,则抛出AttributeError,正如预期的那样。

【讨论】:

  • 在设置self.bar 之前,请务必小心访问缺失的属性。即使在设置 self.bar 之前像 if not hasattr(self, 'bar') 这样的东西也会导致无限的 __getattr__ 递归。
猜你喜欢
  • 2011-12-22
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2018-07-14
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多