Python中的属性

2024-10-01 11:32:29 发布

您现在位置:Python中文网/ 问答频道 /正文

使用“自我”这个变量的原因是什么?一个不链接到已经使用的自我年龄?在

class newprops(object):
    def getage(self):
        return 40
    def setage(self, value):
        self._age = value
    age = property(getage, setage, None, None)

Tags: selfnoneagereturnobjectvalue链接def
3条回答

您的示例实际上是无稽之谈,因为getter返回一个常量。一个单独的下划线命名变量,通常与属性一起使用,它可以是

1)只读

class C(object):
    @property
    def age(self):
        return self._age

在这种情况下,instance.age只能被读取,但不能分配给。惯例是在内部写入self._age。在

2)读写

^{pr2}$

只有在赋值时需要进行额外的计算或检查时,才有意义使用gettersetter。如果没有,您可以简单地声明不带下划线的变量,因为属性和实例变量是以相同的方式访问的(就代码而言)。这就是为什么_age和属性{}必须以不同的名称命名。在

self.age已被属性占用,您需要为实际变量指定另一个名称,这里是_age。在

顺便说一句,你可以用Python.2修饰符编写:

def newprops(object):

    @property
    def age(self):
        return 40

    @age.setter
    def age(self, value):
        self._age = value

一些面向对象的语言具有称为private的属性,这些属性不能从类方法外部访问。这一点很重要,因为有些属性不是要直接更改的,而是要作为其他属性的函数进行更改,或者在更改之前进行验证。在Python中,您没有private属性,但是您可以通过使用getter和setter来实现类似的功能,该变量以下划线开始—Python对私有方法和属性的约定。在

例如。矩形三角形的斜边由h=sqrt(a*a+b*b)给出,因此不能直接更改h,因为关系必须保持不变。另外,假设一个名称必须是LASTNAME COMMA FIRSTNAME格式,那么在分配self.lastname之前,必须验证是否是这样。在

属性getter允许您获取斜边,但禁止您设置斜边。属性设置器允许您设置属性,但您可以在实际设置属性之前进行检查。在

所以:

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')

另一个例子:

^{pr2}$

相关问题 更多 >