2017-12-13 2 views
1

attrsabstract classes을 어떻게 조합 할 수 있는지 궁금합니다. 나는 모든 상속 클래스에 있어야하는 추상 속성을 정의하는 추상 클래스를 정의하고 싶다.Python - 추상 클래스를 상속받은 클래스들

이 상속 클래스에 대해 속성을 정의하려면 attrs를 사용합니다.

AttributeError: can't set attribute 

아마도 추상적 사용하여 바인드합니다?

@attr.s() 
class Parent(object): 
    __metaclass__ = abc.ABCMeta 
    x = attr.ib(abstract=True) 
이 될 수있는 속성을 선언 할 수있는 방법이있다 :

import abc 
import attr 

class Parent(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractproperty 
    def x(self): 
     pass 


@attr.s() 
class Child(Parent): 
    x = attr.ib() 


c = Child(9) 
c.x = 7 

다음과 같은 오류가 발생합니다 : 그래서 모두 약간의 재생 시도

두 모듈의 이점을 얻는 더 좋은 방법을 발견하면 매우 감사하겠습니다!

미리 감사드립니다.

+0

이것은 https://github.com/python-attrs/attrs/issues/293 및 https://github.com/python-attrs/attrs/issues/303을 암시하는 것 같습니다. – hynek

답변

0

글쎄, x = attr.ib()은 속성을 생성하지 않습니다. 속성을 설정하고 있습니다.

예제 코드는 attrs이 특성을 설정하려고 시도 할 때 ABC에서 정의한대로 (설정자를 포함하지 않았으므로) 읽기 전용 특성으로 인해 실패하기 때문에 예제 코드는 c = Child(9)에서 실패합니다.

attrs으로 설정되는 속성은 "인스턴스 변수"로 간주됩니다. Abstract Base Classes에는 추상적 인 인터페이스의 일부로 인스턴스 변수를 기술 할 메커니즘이 없다. (파이썬 3에서조차도 알고있다.)

따라서 attrs과 ABCs 사이에는 상속 충돌이 없지만 attrs 속성은 속성이 아닙니다.