2011-08-21 5 views
2

SubClass에있는 모든 속성 이름을 목록에 넣으려는 경우 Base 클래스에서이 작업을 수행하려고합니다. 어떻게해야합니까? 내 방법은 지금 :Python : 기본 클래스의 메서드에서 하위 클래스의 새 특성 이름을 가져 오는 방법은 무엇입니까?

class Base(): 
    def __init__(self): 
     # print SubClass' new attribues' names ('aa' and 'bb' for example) 
     for attr in dir(self): 
      if not hasattr(Base, attr): 
       print attr 

class SubClass(Base): 
    aa = '' 
    bb = '' 

그렇게 할 수있는 더 좋은 방법은 무엇입니까?


도움 주셔서 감사합니다.

+3

실제로 달성하려는 것은 무엇입니까? –

+0

혼란 스럽습니다. 질문을 편집했습니다. db.Model 클래스의 새 하위 클래스를 정의 할 때 db.Model은 하위 클래스의 특성이 데이터베이스의 열 이름임을 알 수 있습니다. – walknotes

+1

'dir (self)'가 아니라'dir (self .__ class __)'를 원하지 않으면 클래스의 속성뿐만 아니라 인스턴스 속성 (예 : 하위 클래스'__init__'에 정의 됨)을 얻을 수 있습니다. 그렇지 않으면 버전이 본질적으로 광산과 동일하며, 광산은 조금 더 짧습니다. (그리고 논쟁의 여지가 있습니다. '-'는 차이를 의미하며, 원하는 것입니다.) – agf

답변

2

@JohnZwinck이 의견에서 제안했듯이, 당신이 이것을해야한다면 거의 확실하게 설계 실수를 저지르고 있습니다. 그러나 더 많은 정보가 없으면 문제를 진단 할 수 없습니다. 당신이 변화를 원하는 경우

class Base(object): 
    cc = '' 
    def __init__(self): 
     print set(dir(self)) - set(dir(Base)) 
     # print SubClass' new attribues' names ('aa' and 'bb' for example) 

class SubClass(Base): 
    def __init__(self): 
     self.dd = '' 
     super(SubClass, self).__init__() 
    aa = '' 
    bb = '' 


foo = SubClass() 
# set(['aa', 'dd', 'bb']) 

:

이 당신이 원하는 것을 할 수있는 간단한 방법 것 같다

class Base(object): 
    cc = '' # this won't get printed 
    def __init__(self): 
     # print SubClass' new attribues' names ('aa' and 'bb' for example) 
     print set(dir(self.__class__)) - set(dir(Base)) 

class SubClass(Base): 
    aa = '' 
    bb = '' 


foo = SubClass() 
# set(['aa', 'bb']) 

새로운 속성을 테스트하는 대신 selfself.__class__을 필요로하는 이유는 이것이다 으로 정의한 경우 __class__을 사용해야합니다. 그렇지 않은 경우 새 속성을 확인할 때마다 결과가 이됩니다.

+0

고맙습니다, 감사합니다. @agf, Dir (self)와 Dir (self .__ class__)의 차이를 보았습니다. 왜 그들이 전에 같은 것처럼 보는지 모르지만, 이번에는 defferent입니다. 다시 한 번 감사드립니다. – walknotes

관련 문제