我是
Python的新手.所以,如果这是一个基本问题,请原谅我.我在互联网和SO上研究过这个话题,但我找不到解释.我正在使用Anaconda 3.6发行版.
我正在尝试为属性创建一个简单的getter和setter.我将引导你完成我得到的错误.
class Person:
def __init__(self,name):
self.name=name
bob = Person('Bob Smith')
print(bob.name)
这打印出我同意的第一个名字,我没有覆盖print或getattribute方法.此外,这里没有房产.这是为了测试基本代码是否有效.
让我们修改代码来添加属性:
class Person:
def __init__(self,name):
self.name=name
@property
def name(self):
"name property docs"
print('fetch...')
return self.name
bob = Person('Bob Smith')
print(bob.name)
一旦我在PyCharm中编写上面的代码,我就会得到一个黄色的灯泡图标,说明该变量必须是私有的.我不明白其理由.
忽略上面,如果我运行上面的代码,我得到:
06002
现在,我研究了这个主题,我发现有两个修复(不知道为什么会这样):
修复#1:将变量名称更改为_name
class Person:
def __init__(self,name):
self._name=name #Changed name to _name
@property
def name(self):
"name property docs"
print('fetch...')
return self._name #Changed name to _name
bob = Person('Bob Smith')
print(bob.name)
这很好用,因为它正确打印输出.
修复#2:将属性名称从名称(self)更改为_name(self),并将变量名称从_name恢复为name
class Person:
def __init__(self,name):
self.name=name #changed to name
@property
def _name(self): #Changed to _name
"name property docs"
print('fetch...')
return self.name #changed to name
bob = Person('Bob Smith')
print(bob.name)
现在,这可以按预期打印.
下一步,我使用装饰器创建了setter,getter和deleter属性.它们遵循如上所述的类似命名约定 – 即.前缀_到变量名称或方法名称:
@_name.setter
def _name(self,value):
"name property setter"
print('change...')
self.name=value
@_name.deleter
def _name(self):
print('remove')
del self.name
bob = Person('Bob Smith')
print(bob.name)
bob.name = 'Bobby Smith'
print(bob.name)
del bob.name
问题:我不确定为什么Python 3.x强制将_添加到变量名称或方法名称.
所以,现在最大的问题是,为什么我需要使用属性的下划线?我相信那些下划线前缀只是让用户知道这是一个私有变量.
我正在使用Lutz的书来学习Python,上面的例子来自他的书.