2017-03-29 1 views
0

"getattr"사용하려고 할 때 다음과 같은 오류가 계속 :gettar 속성 오류 - 파이썬

AttributeError : 'STR'개체가 어떤 속성이 없다 '는 displayTime'여기

는 내가 코드입니다 사용 :

getattr(className,"displayTime")(self) 

여기서 "클래스 이름"나는 목록에서 촬영도 내 프로그램이 서브 클래스의 이름을 한 문자열을 의미한다. "displayTime"은 해당 서브 클래스 내의 메소드입니다.

나는 그것으로 직접 서브 클래스의 이름을 inputing하여 테스트하려고 :

getattr(seconds,"displayTime")(self) 

이 괜찮 았는데. 누구든지 내가 뭘 잘못하고있는 아이디어가 있습니까?

감사합니다.

+2

당신은 클래스 객체를 잡아해야 할 것 : 당신이이 경우 @Jim Fasarakis 힐리는 코멘트에서 제안이 경우, 이미 수입, 당신은 단순히 globals() 사전에 'chicken'를 찾아 볼 수 있습니다 수행 'globals() [classname]'을 통해; 'getattr'은 당신을 위해 그것을 찾지 못할 것입니다. classname-> classobj 값을 담고있는 사전을 만들어서'globalals'에 대해 걱정하지 않아도됩니다. –

+3

문자열을 사용하지 않고 첫 번째 인수로 인스턴스를 사용해야합니다. – Daniel

+0

'seconds'는''seconds "'가 아닙니다. 문자열은 텍스트를 나타내지 만 클래스에없는 것이거나 이름이 문자열에 저장된 텍스트와 일치하는 경우입니다. – user2357112

답변

0

정확하게 getattr을하고 있습니다. 문제는 문자열에서 객체로 변환해야한다는 것입니다.이 경우 클래스 객체에 대한 참조입니다.

클래스를 식별하는 데는 두 가지 방법이 있습니다. 먼저 부모 모듈 (abc.ABCMeta)을 사용하여 해당 모듈을 식별 할 수 있습니다. 이렇게하려면 sys.modules 사전으로 시작하고 모듈과 하위 모듈을 찾습니다 (즉, 'abc'검색). 그런 다음 이름의 마지막 부분 ('ABCMeta')을 자식으로 갖는 모듈을 갖게됩니다. getattr을 사용하여 모듈에서 자식을 추출한 다음 getattr을 다시 사용하여 원하는 모든 구성원을 얻을 수 있습니다.

import sys 
mod = sys.modules['abc'] 
cls = getattr(mod, 'ABCMeta') 
method = getattr(cls, 'displayTime') # Won't work, not available on class 

두 번째 방법은 사용중인 모듈의 전역 이름 공간에 이름이 있다고 가정하는 것입니다. 예를 들어, 같은 한 경우 :

from abc import ABCMeta as chicken 

당신은 다음 코드에서 전역 심볼, chicken을 참조 수 있으며,이 같은 일을 의미합니다.

clsname = 'chicken' 
cls = globals()[clsname] 
method = getattr(cls, 'displayTime')