gpt4 book ai didi

python - python自动设置getter、setter和deleter

转载 作者:太空狗 更新时间:2023-10-30 00:03:04 24 4
gpt4 key购买 nike

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

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?在我的实际代码中,我有更多的变量,并且似乎有很多重复的代码设置每个方法。

我意识到对于简​​单的情况,它可能不是绝对必要的,但我更愿意现在就对这些方法进行编码,以防我决定增加类的复杂性。

最佳答案

保持简单。

如果您有这样的函数,只需使用可公开访问的变量即可。即:

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)

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

另一个考虑因素是中文/日文名字将姓氏放在前面,人们可以有多个姓氏(尤其是在西类牙)并且可以有中间名。

关于python - python自动设置getter、setter和deleter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com