She*_*hee 7 python oop properties decorator
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)
Run Code Online (Sandbox Code Playgroud)
所以我使用 getName() 得到了相同的结果,那么为什么我们要在 getNameAgain() 中使用 @property 装饰器呢?我可以知道什么更好/建议使用吗?先感谢您!
Gri*_*mar 12
主要区别在于属性或方法的用户如何看待访问。
它们看起来确实不同:
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())
Run Code Online (Sandbox Code Playgroud)
方法是用参数调用的(如果没有参数,则调用空括号),而属性则不然。
此外,对于属性,可能期望能够为其赋值,而对于方法,您需要寻找一个单独的设置器:
@name.setter
def name(self, value):
self._name = value
def set_name(self, value):
self._name = value
f.name = 'baz'
f.set_name('baz')
Run Code Online (Sandbox Code Playgroud)
同样,对于属性,语法是明确的,对于设置器,您可能想知道其他参数。
此外,如果您只需要一个属性,为什么要使用单独的 setter 和 getter 并键入更多括号呢?毕竟,这是Python,而不是Java。
那么什么时候会使用单独的 setter 和 getter 方法而不是属性呢?如果这些方面是您想要的。即,在设置值或检索值时需要附加修饰符,例如encoding。
顺便说一句:我重命名了您的方法和属性,以使其更符合标准 Python 命名约定。由于首先使用属性的主要原因是符合用户期望(库函数的用户,当然不是软件的用户),因此在命名内容时这样做是有意义的。因此,get_name代替getName和._namefor 隐藏值代替.name哪个信号表明用户可以直接操作该值(如果这是预期的话,这很好)。