python 属性的不同设置器

different setters for python properties

我有一个class

class Animal:
    def __init__(self, name='', num_of_owners=0, sleep=0):
        self.name = name
        self.num_of_owners = int(float(num_of_owners))
        self.sleep = float(sleep)

假设我正在读取某个文件的所有属性。

我正在为 getter 和 setters 使用 Properties。

@property
def name(self):
    return self.name

@name.setter
def name(self, value):
    self.name = value

现在从文件中读取时,我不想在我专门得到的字典中查找每个 属性。

所以我可以 运行 在字典上输入一个 for

for name, value in animal_props.iteritems():
     setattr(animal, name, value)

但随后所有属性都设置为字符串。 问题是我有大约 8 个属性,有些是浮动的,有些是 int 的,有些是字符串。

无论如何要 运行 这个,而不是为每个 属性.[=15= 制作常规的 setter 和 运行 一个特定的 setter ]

示例:

class Animal:
    def __init__(self, name='', num_of_owners=0, sleep=0):
        self._name = name
        self._num_of_owners = int(float(num_of_owners))
        self._sleep = float(sleep)

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

    @property
    def num_of_owners(self):
        return self._num_of_owners

    @num_of_owners.setter
    def num_of_owners(self, value):
        self._num_of_owners = int(value)

    @property
    def sleep (self):
        return self._sleep

    @sleep.setter
    def sleep(self, value):
        self._sleep = int(float(value))

d = {'name': 'doggy', 'num_of_owners': '3', 'sleep': '5.643'}
dog = Animal()
for name, value in d.iteritems():
    setattr(dog, name, value)

print type(dog.sleep)

我需要最后的类型是float。因为我以后会用它作为浮点数。

创建单独的 'ifs' 并发送给每个 setter 没问题,但是无论如何只用那个 for.

您正在使用 python 2 和旧式 类。属性仅适用于新样式 类:

class Animal(object):
    ...

如果您真的在使用 Python 2(正如您的标签所建议的那样),您需要更改 class 声明以便继承自 object。这样做会使你的 class 成为 "new style" class 而不是 "old-style" class(这是 class 中唯一的 class =21=] 2.1天)。如果你对这两种class了解不多,不用着急学习老的。只需始终创建新样式 classes(它们是 Python 3 中唯一的一种)。

要创建新样式 class,继承自对象:

class Animal(object):
    #...

请注意,如果您没有在 属性 getter 或 setter 方法中进行类型转换或其他类型的验证(如示例中的 name代码),您还不如摆脱整个 属性 并只使用常规属性。如果您发现稍后在程序设计中确实需要验证,您可以在此时切换回使用 属性,并且从属性读取或写入的代码的其他部分不需要更改。