foo和_foo - 关于类中的变量

-1 投票
5 回答
1099 浏览
提问于 2025-04-15 21:52
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

我真的推荐这个网站:

http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

这里对属性函数的解释很不错。

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

撰写回答