【问题标题】:creating a list of properties vs getters and setters in python在python中创建属性列表与getter和setter
【发布时间】:2016-05-01 11:50:48
【问题描述】:
class OurAtt():
    def __init__(self):
        pass

class OurClass:

    def __init__(self):
        self.__OurAtt = OurAtt()

    @property
    def OurAtt(self):
        return self.__OurAtt

    @OurAtt.setter
    def OurAtt(self, val):
        if val < 0:
            self.__OurAtt = 0
        elif val > 1000:
            self.__OurAtt = 1000
        else:
            self.__OurAtt = val


x = OurClass()
x.OurAtt.Var1 = 1
print x.OurAtt.Var1

问题:

  1. 如何创建一个包含 100 个变量的列表,例如 x.OurAtt.Var1、x.OurAtt.Var2 .. x.OurAtt.Var100 并为其分配初始值 1,2 ....100。

  2. 是否可以对 x.OurAtt.Var[1..100] = [1..100] 执行类似操作?基本上需要有属性的List。

【问题讨论】:

  • 您可以使用内置方法 exec: docs.python.org/3/library/functions.html#exec 来实现这一点,但我建议不要这样做。你的用户故事到底是什么?最终,您可以创建一个字典,因此您将拥有键和值来代替变量。
  • @cezar 非常感谢。条件是仅使用标量或列表或元组而不是字典。你能帮忙吗?
  • 您可以执行以下操作:for i in range(1, 101): exec('OurAtt.Var{0} = {0}'.format(i))。这将为您提供从 OurAtt.Var1 到 OurAtt.Var100 的变量,初始值为 1 到 100。我仍然认为这不是一个好主意。

标签: python properties getter-setter


【解决方案1】:

不要创建单独的varX 属性,不。您可以改用__getitem____setitem__ 方法创建一个新对象,并改用x.your_attr[X] 订阅表示法:

class ListLike(object):
    def __init__(self):
        self._values = list(range(101))

    def __len__(self):
        return len(self._values)

    def __getitem__(self, index):
        return self._values[index]

    def __setitem__(self, index, value):
        if not 0 <= index < len(self):
            raise IndexError(index)
        self._values[index] = max(0, min(1000, val))

然后将其用作您的属性:

class Foo(object):
    def __init__(self):
        self.bar = ListLike()

【讨论】:

  • @Martijin,非常感谢。为什么不能使用属性?你能告诉我使用的优缺点吗?
  • @Sana:您可以使用属性,但是使用编号变量创建 100 个属性会极大地限制您对它们的使用。例如,尝试访问所有 100 个并对其进行计算。在这里使用类似列表的对象更加灵活。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多