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 に答える