Ffi*_*ydd 6 python oop decorator python-2.7
好的,我一直在阅读在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])
Run Code Online (Sandbox Code Playgroud)
如您所见,示例中的大多数代码都致力于定义方法.
我的问题是,是否有办法为我的每个变量自动分配getter,setter和deleter?在我的实际代码中,我有更多的变量,似乎有很多重复的代码设置每个方法.
我意识到,对于简单的情况,它可能不是严格必要的,但我宁愿现在编写方法,以防我决定增加类的复杂性.
把事情简单化。
如果您有这样的函数,只需使用可公开访问的变量即可。那是:
class Person(object):
def __init__(self):
self.firstName = None
self.lastName = None
self.age = None
Run Code Online (Sandbox Code Playgroud)
完全没问题。考虑到用法的更好方法是要求数据作为构造函数的一部分,因此:
class Person(object):
def __init__(self, firstName, lastName, age):
self.firstName = firstName
self.lastName = lastName
self.age = None
person = Person('Peter', 'Smith', 21)
Run Code Online (Sandbox Code Playgroud)
如果您担心哪个名称是哪个,您可以随时具体说明:
person = Person(firstName='Peter', lastName='Smith', age=21)
Run Code Online (Sandbox Code Playgroud)
将来,如果您需要使其变得更复杂,您可以在需要的地方添加 getter/setter。
另一个考虑因素是,给定构造函数,您可以在对象上创建字符串转换函数Person:
def __str__(self):
return ' '.join([self.firstName, self.lastName])
Run Code Online (Sandbox Code Playgroud)
然后,您可以像这样使用它:
person = Person(firstName='Peter', lastName='Smith', age=21)
print(person)
Run Code Online (Sandbox Code Playgroud)
所以你不需要知道它的内部是如何实现的。
另一个考虑因素是中国/日本名字将姓氏放在前面,人们可以有多个姓氏(尤其是在西班牙)并且可以有中间名。