python属性的不同setter

时间:2016-03-27 11:13:25

标签: python python-2.7 properties setter getter-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)

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

我正在使用属性来获取getter和setter。

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

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

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

所以我可以在字典上运行并键入

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

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

无论如何要为此运行,而不是为每个属性制作常规的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)

我需要最后的类型是浮动的。因为我以后会把它用作漂浮物。

创建单独的'ifs'并发送给每个setter是没问题的,但是无论如何只需要那个就可以了。

2 个答案:

答案 0 :(得分:1)

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

class Animal(object):
    ...

答案 1 :(得分:1)

如果您真的使用Python 2(正如您的标记所示),则需要更改类声明,以便继承object。这样做将使您的课程成为一种新的风格"上课而不是老式的#34; class(这是Python 2.1天中唯一的类)。如果你对这两种课程不太了解,不要担心学习旧课程。只需创建新式类(它们是Python 3中唯一的类)。

要创建一个新式类,继承自object:

class Animal(object):
    #...

请注意,如果您未在属性getter或setter方法中进行类型转换或其他类型的验证(与示例代码中的name一样),那么您最好还是摆脱整体属性,只需使用常规属性。如果您在程序的设计中发现以后需要进行验证,则可以切换回使用此处的属性,并且从该属性读取或写入的代码的其他部分不再需要变化