python属性的不同设置器

python属性的不同设置器,python,python-2.7,properties,setter,getter-setter,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 na

我有一节课

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个属性,一些浮点数,一些int,一些字符串

无论如何,要为运行此设置程序,而不是为每个属性创建常规设置程序并运行特定的设置程序

例如:

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是可以的,但是否可以仅使用该设置器来执行此操作。

您将Python2与旧式类一起使用。特性仅适用于新样式的类:

class Animal(object):
    ...

您正在将Python2与旧式类一起使用。特性仅适用于新样式的类:

class Animal(object):
    ...

如果您真的在使用Python2(正如您的标记所建议的),那么您需要更改您的类声明,以便从
对象
继承。这样做将使您的类成为“新样式”类,而不是“旧样式”类(在Python 2.1时代,旧样式是唯一的类)。如果你对这两门课不太了解,不要担心学习旧课。只需始终创建新样式的类(它们是Python3中唯一的一种)

要创建新样式的类,请从对象继承:

class Animal(object):
    #...

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

如果您真的在使用Python 2(如标记所示),您需要更改类声明,以便从
对象继承。这样做将使您的类成为“新样式”类,而不是“旧样式”类(在Python 2.1时代,旧样式是唯一的类)。如果你对这两门课不太了解,不要担心学习旧课。只需始终创建新样式的类(它们是Python3中唯一的一种)

要创建新样式的类,请从对象继承:

class Animal(object):
    #...

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

对我有效。请给出一个最小的示例,说明错误。您所显示的所有代码都是胡说八道。您正在创建一个旧式类(因为您使用的是Python2,而不是从
对象
继承),它不能使用属性。如果可以的话,您将得到无限递归,因为getter请求自身,setter分配给自身(您可能希望使用
\u name
或类似的东西作为属性的“real”属性)。除了这些错误,我完全不知道你在问什么。你想干什么?你为什么认为
属性
与此相关?出了什么问题?添加了我希望发生的事情的示例@Daniel@Blckknght增加了一个例子。没那么难因为你的字典,所有的值都是字符串。删除“数值周围的”复选框。对我有效。请给出一个最小的示例,说明错误。您所显示的所有代码都是胡说八道。您正在创建一个旧式类(因为您使用的是Python2,而不是从
对象
继承),它不能使用属性。如果可以的话,您将得到无限递归,因为getter请求自身,setter分配给自身(您可能希望使用
\u name
或类似的东西作为属性的“real”属性)。除了这些错误,我完全不知道你在问什么。你想干什么?你为什么认为
属性
与此相关?出了什么问题?添加了我希望发生的事情的示例@Daniel@Blckknght增加了一个例子。没那么难因为你的字典,所有的值都是字符串。删除数值周围的“标记”。