문제

다음 모듈의 주요 목표는 일부 이름에 대한 일종의 "상수"의미를 제공하는 것입니다.

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']

그래서 one 그리고 two 속성 액세스는 다음과 같습니다.

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

내가 기대하는 곳 1 이 경우. 내가 어디에 틀렸어?

도움이 되었습니까?

해결책

설명자 프로토콜은 작동합니다 클래스의 속성, 클래스 인스턴스의 속성이 아닙니다. 참조 설명자를위한 방법 가이드

다른 팁

당신은 누락되었습니다 스트리트() 또는 유니 코드상수의 () 방법.

추가하다:

def __unicode__(self):
    return self._name

Python은 클래스가 디스크립터 기계에 액세스하여 조작 할 수 있도록하는 것을 방지한다고 생각합니다. 그렇지 않으면 디스크립터를 조작하는 것은 일종의 '마법'기능 없이는 매우 까다로울 수 있으며, Python이 많은 언어 기계에 액세스 할 수 있도록 시도한 것을 알아 차립니다. 이 문제를 해결하기 위해 나는 종종 수업을 즉석에서 생성했습니다. 예를 들어, 상수 클래스는 다음과 같이 선언 될 수 있습니다.

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]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top