首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动设置python中的getter、setter和getter

自动设置python中的getter、setter和getter
EN

Stack Overflow用户
提问于 2013-12-13 20:08:23
回答 3查看 4.7K关注 0票数 9

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

代码语言:javascript
运行
复制
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?在我的实际代码中,我有更多的变量,似乎有很多重复的代码设置每个方法。

我意识到,对于简单的情况,这可能是不必要的,但是,如果我决定增加类的复杂性,那么现在我更愿意编写这些方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-13 20:20:42

保持简单。

如果您有类似的函数,只需使用一个可公开访问的变量即可。这就是:

代码语言:javascript
运行
复制
class Person(object):
    def __init__(self):
        self.firstName = None
        self.lastName = None
        self.age = None

完全没问题。考虑到这种用法,一种更好的方法是要求数据作为构造函数的一部分,因此:

代码语言:javascript
运行
复制
class Person(object):
    def __init__(self, firstName, lastName, age):
        self.firstName = firstName
        self.lastName = lastName
        self.age = None

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

如果您关心的是哪个名称,您可以始终具体如下:

代码语言:javascript
运行
复制
person = Person(firstName='Peter', lastName='Smith', age=21)

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

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

代码语言:javascript
运行
复制
def __str__(self):
    return ' '.join([self.firstName, self.lastName])

这样,您就可以像这样使用它:

代码语言:javascript
运行
复制
person = Person(firstName='Peter', lastName='Smith', age=21)
print(person)

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

另一个考虑是,中国/日本的名字放在姓氏的第一位,人们可以有多个姓氏(尤指姓氏)。在西班牙),可以有中间名。

票数 5
EN

Stack Overflow用户

发布于 2013-12-13 20:13:29

属性装饰器的全部目的是使您不需要从一开始就定义它。直接访问属性与通过属性访问属性的语法完全相同。所以你应该把它完全排除在外,直到你真的有了复杂的逻辑,然后才会变成属性。

票数 2
EN

Stack Overflow用户

发布于 2013-12-13 20:14:38

手动设置器和删除器定义是一种明确的方式,用于表示“我花费了大量时间创建这个接口,您可以自由设置、删除和获取该属性,而不必担心破坏代码”。

否则,您可以简单地使用实例变量而不使用属性修饰器。

代码语言:javascript
运行
复制
def __init__(self):

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

另外,您可能希望查看PEP-8中的pythonic变量命名和代码样式设置约定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20575094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档