【问题标题】:How python variables name in getter and setter method are different to the name in its constructor?getter 和 setter 方法中的 python 变量名称与其构造函数中的名称有何不同?
【发布时间】:2016-03-05 16:23:54
【问题描述】:

我对 python 食谱中的一个属性示例感到困惑。

class Person:
     def __init__(self, first_name):
          self.first_name = first_name
     @property
     def first_name(self): 
          return self._first_name
     @first_name.setter
     def first_name(self, value): 
          self._first_name = value
>>>people = Person('Tom')
>>>people.first_name
'Tom'
>>>people.first_name = 'Jack'
>>>people.first_name
'Jack'

当一个实例被创建时,一个参数分配给 self.first_name。但是,当调用 getter 属性时,它将返回 self._first_name 的值,因为 self.first_name 与 self._first_name 不同。 self.first_name 和 self._first_name 之间有什么关系?这两个不同的变量如何相互关联?

【问题讨论】:

  • first_name 是一个属性,_first_name 是一个属性。
  • 代码看起来无效。 self.first_name = namename 是未定义的,但即使是self.first_name = first_name,它也会替换属性定义。
  • >>> people._first_name 无效。
  • @Peter 怎么“无效”,用在哪里?
  • _first_name 从未设置。

标签: python properties


【解决方案1】:

self.first_name/people.first_name 是设置方法转属性def first_name(self, value),而self._first_name 是保存值的实际属性。构造函数使用setter设置初始名称,它不直接分配给属性。

  1. 构造函数接收值作为函数参数
  2. 构造函数分配给first_name的属性
  3. 调用 setter def first_name 其中
  4. 分配给属性_first_name

请注意,构造函数中还有一个令人困惑的拼写错误,应该是self.first_name = first_name

【讨论】:

  • 不,self.first_name = first_name 清除了属性,_first_name 永远不会被设置。
  • 如果 Person 派生自 2.7 中的 object,那么它也可以工作。类在 3.0 中自动派生自 object
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2013-06-04
  • 2020-10-07
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多