代码之家  ›  专栏  ›  技术社区  ›  Mumfordwiz

python属性的不同setter

  •  0
  • Mumfordwiz  · 技术社区  · 9 年前

    我有一节课

    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使用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,一些字符串。

    无论如何,要为运行它,而不是为每个属性创建常规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是很好的,但无论如何,只需要一个就可以了。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Daniel    9 年前

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

    class Animal(object):
        ...
    
        2
  •  1
  •   Blckknght    9 年前

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

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

    class Animal(object):
        #...
    

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