2017-11-01 1 views
1

자식 프로세스가 특정 속성을 갖기를 원하지만 자식 메서드를 속성 데코레이터를 상속 할 수 없으므로 최소한 이러한 특성은 다음과 같습니다. 클래스의 속성. 이 같은Assert 자식 특성은 부모 클래스의 속성입니다.

뭔가 : 시간 Parent.__init__()에 의해

class Parent: 
    def __init__(self): 
     assert isinstance(self.foo, property) 

    def foo(self): 
     raise NotImplementedError 

class Child(Parent): 
    def __init__(self): 
     super().__init__() 

    @property 
    def foo(self): 
     return 'bar' 

그러나 물론

이 실행될 때, self.foo'bar'을하게하고 AssertionError가있다. 메타 클래스를 사용하여 수행 할 작업을 수행 할 수있는 방법이 있습니까? 그렇다면 Parent 클래스가 Child이 아닌 메타 클래스를 상속하는 클래스 일 수 있습니까?

+0

https://docs.python.org/3/library/abc.html#abc.abstractproperty를 사용하지 않으시겠습니까? – jonrsharpe

+0

아, 완벽 해요. 제출하고 대답하면 받아 들일 것입니다. – v4gil

+0

사실, 이것은 좋아 보이지만 작동시키지 못합니다. abc.abstractproperty는 더 이상 사용되지 않으며 속성이있는 abstractmethod를 사용한다고 설명합니다. 어느 방향 으로든 오류를 제기 할 수는 없습니다. – v4gil

답변

0

해결책을 찾았습니다.

from inspect import ismethod 

class Parent: 
    def __init__(self): 
     assert not ismethod(self.foo, property) 

    def foo(self): 
     raise NotImplementedError 

이 대부분의 경우에 작동하지만 속성 자체가 바운드 방법입니다 Child.foo에 의해 반환되는 경우 실패합니다 대신 self.foo는 속성입니다 여부를 테스트하는, 나는 바운드 방법이 아니었다 여부를 테스트했다. 보다 완전한 대답을 위해 아직 열어두고 있습니다.

관련 문제