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
代码),您还不如摆脱整个 属性 并只使用常规属性。如果您发现稍后在程序设计中确实需要验证,您可以在此时切换回使用 属性,并且从属性读取或写入的代码的其他部分不需要更改。
我有一个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
代码),您还不如摆脱整个 属性 并只使用常规属性。如果您发现稍后在程序设计中确实需要验证,您可以在此时切换回使用 属性,并且从属性读取或写入的代码的其他部分不需要更改。