在python中自动设置getter,setter和deleter

时间:2013-12-13 20:08:24

标签: python oop python-2.7 decorator

好的我一直在阅读在Python中使用@property装饰器而不是获取,设置和删除的具体方法。一些示例代码如下所示。

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 个答案:

答案 0 :(得分: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)

将来,如果你需要使它更复杂,你可以在需要的地方添加getter / setter。

另一个考虑因素是,给定构造函数,您可以在Person对象上创建字符串转换函数:

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

然后允许您使用它:

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

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

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

答案 1 :(得分:2)

属性修饰器的重点在于需要从头开始定义它。直接访问属性与通过属性访问属性的语法完全相同。所以你应该把它完全留下来,直到你确实拥有复杂的逻辑,然后才变为属性。

答案 2 :(得分:0)

手动setter和deleter定义是一种明确的说法"我花了很多时间创建这个界面,你可以自由设置,删除和获取这个属性而不用担心破坏代码"。

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

def __init__(self):

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

另外,您可能希望了解PEP-8的pythonic变量命名和代码样式约定。