2013-12-13 53 views
6

好的我一直在阅读关于在Python中使用@property装饰器,而不是用于获取,设置和删除的特定方法。下面显示了一些示例代码。在Python中自动设置getter,setter和deleter

class Person(object): 

    def __init__(self): 

     self._firstName = None 
     self._lastName = None 
     self._age = None 

    @property 
    def firstName(self): return self._firstName 
    @firstName.setter 
    def firstName(self, val): self._firstName = val 
    @firstName.deleter 
    def firstName(self): del self._firstName 

    @property 
    def lastName(self): return self._lastName 
    @lastName.setter 
    def lastName(self, val): self._lastName = val 
    @lastName.deleter 
    def lastName(self): del self._lastName 

    @property 
    def age(self): return self._age 
    @age.setter 
    def age(self, val): self._age = val 
    @age.deleter 
    def age(self): del self._age 

Peter = Person() 

Peter.firstName = 'Peter' 
Peter.lastName = 'Smith' 
Peter.age = 21 

print ' '.join([Peter.firstName, Peter.lastName]) 

正如您所看到的,该示例中的大部分代码都致力于定义方法。

我的问题是是否有一种方法可以为我的每个变量自动分配getter,setter和deleter?在我的实际代码中,我有更多的变量,它似乎是很多重复代码设置每种方法。

我意识到,对于简单的情况,它可能不是严格必要的,但我更愿意现在编写方法,以防万一我决定增加类的复杂性。

+3

*“不过,如果我决定增加课程的复杂性,我宁愿现在编写方法。”* - 为什么不在需要时添加它们?只实现你现在需要的*,然后在代码增长时重构。您现在添加的用于支持可能发生或可能不会发生的扩展或功能的所有内容都只是噪声。 –

回答

3

保持简单。

如果你有这样的功能,只需使用一个可公开访问的变量。那就是:

class Person(object): 
    def __init__(self): 
     self.firstName = None 
     self.lastName = None 
     self.age = None 

是非常好的。考虑到使用更好的方法是,要求数据作为构造的一部分,即:

class Person(object): 
    def __init__(self, firstName, lastName, age): 
     self.firstName = firstName 
     self.lastName = lastName 
     self.age = None 

person = Person('Peter', 'Smith', 21) 

如果你关心哪个名字是哪个,你总是可以具体:

person = Person(firstName='Peter', lastName='Smith', age=21) 

在未来,如果你需要使它更复杂,你可以在需要的地方添加getters/setters。

另一个考虑是,给出的构造函数,你可以在Person对象上创建一个字符串转换功能:

def __str__(self): 
    return ' '.join([self.firstName, self.lastName]) 

这就可以让你用它喜欢:

person = Person(firstName='Peter', lastName='Smith', age=21) 
print(person) 

,所以你不要不需要知道它是如何在内部实施的。

另一个考虑因素是中文/日文名字首先将姓氏放在姓氏上,人们可以有多个姓氏(特别是在西班牙)并且可以有中间名字。

2

属性修饰器的整点是让你不需要需要从一开始就定义它。直接访问属性与通过属性访问属性的语法完全相同。所以你应该彻底抛弃它,直到你确实拥有复杂的逻辑,然后才改变属性。

0

手动设置器和删除器定义是一种明确的方式:“我花了很多时间创建此接口,并且可以自由设置,删除和获取此属性,而不用担心破坏代码”。

否则,你可以简单地使用没有属性装饰器的实例变量。

def __init__(self): 

    self.firstName = None 
    self.lastName = None 
    self.age = None 

在一个侧面说明,你可能要采取PEP-8的外观为Python的变量命名和编码风格公约。