我是Python新手。所以,请原谅我,如果这是一个基本的问题。我在网上研究过这个话题,但是我找不到解释。我使用的是水蟒3.6分发版。在
我试图为属性创建一个简单的getter和setter。我会把我的错误告诉你。在class Person:
def __init__(self,name):
self.name=name
bob = Person('Bob Smith')
print(bob.name)
这将打印出我同意我没有重写print或getattribute方法的名字。而且,这里没有财产。这是为了测试基本代码是否有效。在
让我们修改代码以添加属性:
^{pr2}$
当我用PyCharm编写上面的代码时,我会看到一个黄色的灯泡图标,说明变量必须是私有的。我不明白理由。在
忽略上面的内容,如果我在上面运行代码,我会得到:Traceback (most recent call last): File "C:\..., in run_code
exec(code_obj, self.user_global_ns, self.user_ns) File "", line 2, in
bob = Person('Bob Smith') File "", line 4, in __init__
self.name=name AttributeError: can't set attribute
现在,我研究了这个主题,我发现有两种修复方法(不知道为什么会这样做):
修复1:将变量name更改为_nameclass 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:将属性名从name(self)改为_name(self),并将变量名从_name还原为nameclass 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)
现在,这张照片和预期的一样。在
下一步,我使用decorator创建了setter、getter和{}属性。它们遵循与上述类似的命名约定——即变量名或方法名的前缀_:@_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
问题:我不太清楚Python3.x为什么强制向变量名或方法名添加_。
所以,现在最大的问题是,为什么我需要使用下划线来处理属性?我相信这些下划线前缀只是为了让用户知道这是一个私有变量。在
我使用Lutz的书来学习Python,上面的例子是从他的书中得到启发的。在