9
class Books():
    def __init__(self):
        self.__dict__['referTable'] = 1

    @property
    def referTable(self):
        return 2

book = Books()
print(book.referTable)
print(book.__dict__['referTable'])

跑步:

vic@ubuntu:~/Desktop$ python3 test.py 
2
1

Books.referTable 作为数据描述符不受以下影响book.__dict__['referTable']

property()函数被实现为数据描述符。因此,实例不能覆盖属性的行为。

为了隐藏它,我必须使用我自己的描述符而不是property内置描述符。是否有内置描述符,property但它不是数据?

4

2 回答 2

5

为了扩展我的评论,为什么不简单地像这样:

>>> class Books():
...     def __init__(self):
...         self.__dict__['referTable'] = 1
...     @property
...     def referTable(self):
...         try:
...             return self.__dict__['referTable']
...         except KeyError:
...             return 2
... 
>>> a = Books()
>>> a.referTable
1
>>> del a.__dict__['referTable']
>>> a.referTable
2

现在,我想指出,我认为这不是一个好的设计,你最好使用私有变量而不是__dict__直接访问。例如:

class Books():
    def __init__(self):
        self._referTable = 1

    @property
    def referTable(self):
        return self._referTable if self._referTable else 2

简而言之,答案是否定的,property()在 Python 标准库中没有其他选择可以按照您想要的方式工作。

于 2012-04-29T17:51:46.500 回答
2

有一些与内置非数据描述符非常相似的东西——类属性:

class Books():

    referTable = 'default'

    def __init__(self, referTable=None):
        if referTable is not None:
            self.referTable = referTable


book = Books()
print(book.referTable)
# default
book.referTable = 'something specific'
print(book.referTable)
# something specific

如果您需要更像属性的东西(例如,您希望一个函数第一次做一些繁重的工作,但随后将第一个值用于所有将来的引用),那么您需要自己构建它:

class OneTime(object):

    def __init__(self, method):
        self.name = method.__name__
        self.method = method

    def __get__(self, inst, cls):
        if inst is None:
            return self
        result = self.method(inst)
        inst.__dict__[self.name] = result
        return result

class Books(object):

    @OneTime
    def referTable(self):
        print 'calculating'
        return 1 * 2 * 3 * 4 * 5

b = Books()
print b.__dict__
print b.referTable
print b.__dict__
print b.referTable

结果如下:

{}
calculating
120
{'referTable': 120}
120
于 2016-02-26T23:21:09.523 回答