foo和_foo - 关于类中的变量
class ClassName(object):
"""
"""
def __init__(self, foo, bar):
"""
"""
self.foo = foo # read-write property
self.bar = bar # simple attribute
def _set_foo(self, value):
self._foo = value
def _get_foo(self):
return self._foo
foo = property(_get_foo, _set_foo)
a = ClassName(1,2)
#a._set_foo(3)
print a._get_foo()
当我打印 a._get_foo() 的时候,这个 _get_foo 函数会打印出变量 self._foo。可是,这个 self._foo 是从哪里来的呢?
self._foo 和 self.foo 是不一样的,对吧?
补充说明:问题是我还是不太明白属性(property)是干什么的。给我点时间去理解一下。
5 个回答
1
你定义了一个叫做 foo 的属性,并且为它设置了获取和设置的方法。
这些获取和设置的方法使用了一个变量 self._foo
,因为你就是这么写的:
def _set_foo(self, value):
self._foo = value
在你的情况下,如果你稍微改动一下实现,就会出现问题:
class ClassName(object):
"""
"""
def __init__(self,):
"""
"""
pass
def _set_foo(self, value):
self._foo = value
def _get_foo(self):
return self._foo
foo = property(_get_foo, _set_foo)
a = ClassName()
print a.foo
-> AttributeError
b = ClassName()
b.foo = 1 # implicitely sets self._foo !
print b.foo
>> OK, this is 1
实际上,你应该在 __init__
方法里设置 self.foo
,因为设置方法会创建 self._foo
。当然,你也可以直接在 __init__
方法里初始化 self._foo
。
那么,self.foo 和 self._foo 是从哪里来的呢?在代码里是很明确的。self.foo 是一个属性,而 self._foo 是你决定用来存储这个属性值的变量。
2
2
关于 property
的使用说明可以在这里找到。这两行代码其实没有什么区别:
self.foo = foo # read-write property
和
a.foo = 3
另外,你也不应该手动调用设置器和获取器。
补充说明:如果你在看完文档中的例子和我们的回答后,还是不明白 property
是干什么的,那你可能暂时不需要使用它。其实它并不是Python中最重要的功能。你可以先从一个更简单、容易理解的例子入手:
>>> class ClassName(object):
def __init__(self, foo):
self.foo = foo
>>> a = ClassName(1, 2)
>>> a.foo
1
>>> a.foo = 42
>>> a.foo
42