문제

클래스의 일부로 데이터 디스크립터를 갖고 싶습니다.실제로 Class 메소드에서 처리하는 속성이 실제로 등록 정보를 원하는 것을 의미합니다.

파이썬 이이 작업을 직접적으로 지원하지는 않지만 type 클래스를 서브 클래 싱하는 것으로 구현할 수 있습니다.따라서 type의 하위 클래스에 속성을 추가하면 인스턴스가 해당 속성에 대한 설명자가있게됩니다.그 인스턴스는 수업입니다.따라서 클래스 디스크립터.

이게 적용 할 수 있습니까?내가 조심해야 할 문치가 있습니까?

도움이 되었습니까?

해결책

클래스에서 액세스 할 때 디스크립터에 액세스 할 때 디스크립터 객체 자체를 반환하는 것은 관찰 (일반적으로)입니다. 이것은 property가 수행하는 것입니다. 클래스에서 속성 오브젝트에 액세스하는 경우 속성 오브젝트가 다시 시작되므로 __get__ 메서드가 선택하는 것이므로). 그러나 그것은 협약입니다. 당신은 그렇게 할 필요가 없습니다.

클래스에 getter 설명자 만 있으면 설정 시도가 설명자를 덮어 쓸 것입니다. 이와 같은 작업을 수행 할 수 있습니다. MetaClass 프로그래밍 :

def classproperty_getter_only(f):
    class NonDataDescriptor(object):
        def __get__(self, instance, icls):
            return f(icls)
    return NonDataDescriptor()

class Foo(object):

    @classproperty_getter_only
    def flup(cls):
        return 'hello from', cls

print Foo.flup
print Foo().flup
.

('hello from', <class '__main__.Foo'>)
('hello from', <class '__main__.Foo'>)
.

전체 Fledged Data Descriptor를 원하거나 기본 제공 속성 오브젝트를 사용하려면 메타 클래스를 사용할 수 있고 거기에 넣을 수 있습니다 (이 속성은 귀하의 인스턴스에서 완전히 보이지 않음을 알 수 있습니다. 클래스; 클래스의 인스턴스에서 속성 조회를 수행 할 때 메타 클래스가 검사되지 않음).

권장 사항이 있습니까? 나는 그렇게 생각하지 않는다. 나는 생산 코드에서 부담없이 당신이 묘사하는 것을하지 않을 것입니다. 나는 그렇게 할 수있는 매우 강력한 이유가 있었다면 나는 그것을 고려할 것입니다 (그리고 나는 내 머리 꼭대기에서 그러한 시나리오를 생각할 수 없다). Metaclasses는 매우 강력하지만 모든 프로그래머가 잘 이해할 수 없으며 이유가 있기 때문에 사용하기가 더 어려워 지므로 코드를 유지하기가 더 어려워집니다. 나는 이런 종류의 디자인이 파이썬 커뮤니티에 의해 큰 것에 익숙해 질 것입니다.

다른 팁

는 "클래스 메소드에서 처리하는 속성이있는"클래스 속성이 속성이있는 클래스 속성 "을 의미합니다."

Decorator property를 사용하여 액세서가 실제 데이터 멤버 인 것으로 보이게 할 수 있습니다.그런 다음 x.setter DecoRator를 사용하여 해당 속성에 대해 설정터를 만듭니다.

object에서 상속 받거나 작동하지 않습니다.

class Foo(object):
    def __init__(self):
            self._hiddenx = 3
    @property
    def x(self):
            return self._hiddenx + 10
    @x.setter
    def x(self, value):
            self._hiddenx = value

p = Foo()

p.x #13

p.x = 4
p.x #14
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top