2016-10-22 2 views
2

나는 Do not Repeat Yourself (DRY) 원리와 매우 흡사하며, 그것의 한 예로서, 나는 그 정의 안에서 클래스의 이름을 사용하는 것을 좋아하지 않는다. 클래스 이름을 변경하려면 클래스 정의 내에서 모든 항목을 변경해야합니다.Python 2.7에서 DRY가 아닌 수퍼 클래스 속성에 액세스합니까?

이제 docs에서 읽은 수퍼 클래스 속성에 액세스하는 일반적인 관용구가 다음과 같습니다.

class A(object): 
    def method(self): 
     print('Hi!') 
class B(A): 
    def method(self): 
     super(B, self).method() # fixed reference to B, not DRY 

B.

를 서브 클래스 때 대신 무한 재귀으로 이어질 것 "유형 (자기)"또는 "자기 .__ class__"를 사용하여 같은 클래스 이름, 나는이 경우 DRY를 건너해야합니까? 아니면 하위 클래스의 정의 내에서 하위 클래스를 참조하는 다른 마법 속성이 있습니까?

답변

1

example in the documentation은 하위 클래스의 명시 적 이름을 사용합니다. 내가 알 수있는 한, 이것은 불행하고 피할 수없는 Python 2.7의 결함이다. 이 B 안에 명시 적으로 클래스 이름 중 하나 명 발생을 잎

class A(object): 
    def method(self): 
     print('Class A method') 
class B(A): 
    def __init__(self): 
     self.myclass = B 
     super(self.myclass, self).__init__() 
    def method(self): 
     print('Class B method') 
     super(self.myclass, self).method() 

,하지만 난 self.myclass를 사용하여 모든 다른 사람을 방지 할 수 있습니다

그러나이 나를 위해 작동하는 것 같다.

+0

문서 참조 주셔서 감사합니다, Tom. 그러나 이것은 "B"의 클래스 정의 안에있는 "B"의 수를 줄이지 만, 여전히 DRY가 아닙니다. 지금까지 다른 대답이 없었기 때문에, 필자가 작성한대로 불가피한 것으로 받아 들일 것입니다. – virtualnobi

0

나는 이것이 오래된 질문이라는 것을 알고 있지만, 나는 이것을 참고로 남겨두고 싶다.

metaclasses 인 클래스를 포함하는 속성을 자동으로 추가 할 수 있습니다. 이 같은

뭔가 작동합니다

class Metaclass(type): 
    def __init__(cls, name, bases, attrs): 
    cls.what_class = cls 

class A(metaclass=Metaclass): 
    pass 

class B(A): 
    pass 

print(A().what_class) # <class 'A'> 
print(B().what_class) # <class 'B'> 

당신은 내가 this question로 보일 것이다 또 다른 메타 클래스에 이것을 사용합니다.

관련 문제