如何在Python中设置属性预先检查其值?

Thi*_*aes 1 python properties

我有一个变量,它的内容,我需要从远程服务器获取,所以我宁愿等到真正需要的内容.我想如果使用一个属性,但似乎我做错了.根据例子.

def download():
    return 'content from remote server'

class Foo:
    def __init__(self):
        self.downloaded_bar = False
        self.bar = None

    @property
    def bar():
        if not self.downloaded:
            self.bar = download()
            self.downloaded = True
        return self.bar

f = Foo()
print f.bar #prints None, I expected 'content from remote server'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Joh*_*ooy 5

您需要Foo为描述符创建一个新的样式类.您也不能拥有与该属性同名的属性,因此我更改.bar._bar 您还需要修复错误(downloaded_bar)

def download():
    return 'content from remote server'

class Foo(object):                    # Inherit from object for new style class!
    def __init__(self):
        self.downloaded = False
        self._bar = None

    @property
    def bar(self):
        if not self.downloaded:
            self._bar = download()
            self.downloaded = True
        return self._bar

f = Foo()
print f.bar     def download():
    return 'content from remote server'
Run Code Online (Sandbox Code Playgroud)

实际上你根本不需要这个downloaded属性

class Foo(object):
    def __init__(self):
        self._bar = None

    @property
    def bar(self):
        if self._bar is None:
            self._bar = download()
        return self._bar

f = Foo()
print f.bar 
Run Code Online (Sandbox Code Playgroud)