我有一个班级
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是没问题的,但是无论如何只需要那个就可以了。
答案 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
一样),那么您最好还是摆脱整体属性,只需使用常规属性。如果您在程序的设计中发现以后需要进行验证,则可以切换回使用此处的属性,并且从该属性读取或写入的代码的其他部分不再需要变化