如何解决当我可以使用常规方法getter时,为什么要使用@property装饰器?
class Employee:
def __init__(self,name):
self.name = name
def getName(self):
return self.name
@property
def getNameAgain(self):
return self.name
person = Employee("John")
print(person.getName()) #John <--(calling method)
print(person.name) #John <--(using @property)
所以使用getName()可以获得相同的结果,那么为什么要在getNameAgain()中使用@property装饰器呢?我可以知道什么是更好/建议使用的吗?预先谢谢你!
解决方法
主要区别在于属性或方法的用户如何感知访问。
它们的外观肯定不同:
class Foo:
def __init__(self,name):
self._name = name
def get_name(self):
return self._name
@property
def name(self):
return self._name
f = Foo('bar')
print(f.name)
print(f.get_name())
调用带有参数的方法(如果没有,则使用空括号),而没有属性。
此外,对于一个属性,可以期望能够为其分配值,而对于方法,则需要一个单独的设置器:
@name.setter
def name(self,value):
self._name = value
def set_name(self,value):
self._name = value
f.name = 'baz'
f.set_name('baz')
同样,对于属性而言,语法是明确的,对于setter,您可能想知道其他参数。
此外,如果只需要一个属性,为什么还要使用单独的setter和getter并键入更多的括号?毕竟,这是Python,而不是Java。
那么什么时候使用单独的setter和getter方法而不是属性?如果这些方面是您想要的。即在设置值或检索值时,例如,您需要其他修饰符。 encoding
。
顺便说一句:我重命名了您的方法和属性,使其更符合标准的Python命名约定。由于开始使用属性的主要原因是要符合用户的期望(当然是您的库函数的用户,而不是软件的用户),因此在命名内容时这样做是有意义的。因此,用get_name
代替getName
,用._name
代替隐藏值,而不是.name
,这表示用户可以直接操作该值(如果这样,可以预期)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。