해당 속성의 이름에 해당하는 문자열이 주어진 객체 속성에 액세스하는 방법


153

t의해 주어진 속성 값을 어떻게 설정 / 얻 x습니까?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"

답변:


284

내장 함수가 getattr있으며setattr

getattr(object, attrname)
setattr(object, attrname, value)

이 경우

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

12
속성을 삭제하는 데 지연이 있지만 이는 거의 사용되지 않습니다.
Dave Kirby

11
getattr (object, attrname, default)의 세 가지 인수 형식을 사용하는 것이 종종 더 좋지만 객체에 특정 속성이 있는지 여부를 테스트하는 hasattr이 있습니다.
던컨

어쨌든 우리는 이와 같은 getattr을 사용할 수 있고 var x의 문자열로 df1변수 x = 'df1'ie df1을 가지고 있다고 말합니다 . 나는이 같은 DF의 모양을 인쇄 할, getattr(x, 'shape')또는 getattr('df1', 'shape'). getattr, 다른 방법으로는이 작업을 수행 할 수 없다는 것을 알고 있습니다.
ihightower

3

참고 :이 답변은 매우 구식입니다. 2008 년new더 이상 사용되지 않는 모듈을 사용하여 Python 2에 적용됩니다 .

파이썬에는 setattr 및 getattr 함수가 내장되어 있습니다. 클래스의 속성을 설정하고 얻는 데 사용할 수 있습니다.

간단한 예 :

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20

0

클래스 내부에 로직을 숨기려면 다음과 같이 일반화 된 getter 메소드를 사용하는 것이 좋습니다.

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

출력 :

Attribute value of attr1 is 1

더 잘 숨길 수있는 또 다른 접근 방식은 magic 메소드를 사용하는 __getattribute__것이지만 그 메소드 내에서 속성 값을 검색하려고 할 때 해결할 수없는 끝없는 루프를 계속 얻었습니다.

또한을 사용할 수도 있습니다 vars(). 위의 예에서, 당신은 교환 수 getattr(self,varname)에 의해 return vars(self)[varname],하지만 getattr에 대한 대답에 따라 바람직 할 수 사이의 차이가 무엇 varssetattr? .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.