class Person(object)
def __init__(self):
# The actual attribute is _name
self._name = None
@property
def name(self):
# when I ask for the name, I mean to get _name
return self._name
@name.setter
def name(self, value):
# before setting name I can ensure that it has the right format
if regex_name.match(value):
# assume you have a regular expression to check for the name
self._name = value
else:
raise ValueError('invalid name')
您的示例实际上是无稽之谈,因为getter返回一个常量。一个单独的下划线命名变量,通常与属性一起使用,它可以是
1)只读
在这种情况下,
instance.age
只能被读取,但不能分配给。惯例是在内部写入self._age
。在2)读写
^{pr2}$只有在赋值时需要进行额外的计算或检查时,才有意义使用getter和setter。如果没有,您可以简单地声明不带下划线的变量,因为属性和实例变量是以相同的方式访问的(就代码而言)。这就是为什么}必须以不同的名称命名。在
_age
和属性{self.age
已被属性占用,您需要为实际变量指定另一个名称,这里是_age
。在顺便说一句,你可以用Python.2修饰符编写:
一些面向对象的语言具有称为private的属性,这些属性不能从类方法外部访问。这一点很重要,因为有些属性不是要直接更改的,而是要作为其他属性的函数进行更改,或者在更改之前进行验证。在Python中,您没有private属性,但是您可以通过使用getter和setter来实现类似的功能,该变量以下划线开始—Python对私有方法和属性的约定。在
例如。矩形三角形的斜边由
h=sqrt(a*a+b*b)
给出,因此不能直接更改h
,因为关系必须保持不变。另外,假设一个名称必须是LASTNAME COMMA FIRSTNAME
格式,那么在分配self.lastname
之前,必须验证是否是这样。在属性getter允许您获取斜边,但禁止您设置斜边。属性设置器允许您设置属性,但您可以在实际设置属性之前进行检查。在
所以:
另一个例子:
^{pr2}$相关问题 更多 >
编程相关推荐