1

次のモジュールの主な目的は、いくつかの名前に一種の「一定の」セマンティクスを提供することです。

class ConstantError(Exception):

    def __init__(self, msg):
            self._msg = msg


class Constant(object):

    def __init__(self, name):
            self._name = name

    def __get__(self, instance, owner):
            return instance._content[self._name]

    def __set__(self, instance, value):
            raise ConstantError, 'Illegal use of constant'


class Constants(object):

    def __init__(self, content):
            self._content = content
            for k in self._content:
                    setattr(self, k, Constant(k))

num_const = Constants({
    'one': 1,
    'two': 2
})

使用時:

>>> from const import *
>>> dir(num_const)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_content', 'one', 'two']

それでonetwoそこにありますが、属性アクセスは期待外れです:

>>> num_const.one
<const.Constant object at 0x7faef4871710>
>>> 

この場合、私が期待1したところ。私はどこが間違っていますか?

4

3 に答える 3

3

記述子プロトコルは、クラスのインスタンスの属性ではなく、クラスの属性に対してのみ機能します。記述子のハウツー ガイドを参照してください。

于 2009-12-09T14:00:58.780 に答える
0

pythonは、クラスが記述子機構にアクセスするのを防ぎ、操作できるようにすると思います。そうしないと、ある種の「魔法の」関数がないと記述子の操作が非常に難しくなる可能性があります。Pythonが多くの言語機構にアクセスできるようにしようとしていることに気付いた場合は、これを回避するために、私はしばしばその場でクラスを生成しました。たとえば、Constantsクラスは次のように宣言できます。

class Constants(object):
    def __new__(cls, content):
       class _Constants(object):
           pass
       constants = _Constants
       constants._content = content
       for k in constants._content:
            setattr(_Constants, k, Constant(k))
       return constants

しかし、実際には、あなたの目的のために、あなたはより良いかもしれません:

class Constants(object):
    def __init__(self, content):
       self._content = content
    def __getattr__(self,key):
       return self._content[key]
于 2011-07-19T03:57:33.870 に答える
0

定数にstr () またはunicode () メソッドがありません。

追加:

def __unicode__(self):
    return self._name
于 2009-12-09T13:56:46.503 に答える