IT/언어

[python] 오브젝트의 속성을 조작하는 delattr/getattr/hasattr/setattr

개발자 두더지 2022. 1. 13. 22:23
728x90

 내장함수 delattr/getattr/hasattr/setattr은 각각 오브젝트로부터 속성의 삭제/오브젝트의 속성 값의 획득/오브젝트에 속성이 있는지 확인/오브젝트에 대해 속성을 설정을 한다. 아래와 같이 표시할 수 있다.

delattr(object, name)  # object로부터 속성name을 삭제
getattr(object, name[, default])  # object의 속성 name값을 획득
hasattr(object, name)  # object에 속성 name가 있는지를 확인
setattr(object, name, value)  # object의 속성 name값을 value로 설정

 

 

 

내장함수 delattr/getattr/hasattr/setattr

 


delattr

 내장함수 delattr는 제1인수에 지정한 오브젝트로 부터 제 2인수에 지정한 이름의 속성을 삭제한다. 오브젝트 o에 속성 a가 있다고 가정한다면, "delattr(o, a)"는 "del o.a"와 동등한 처리를 실행한다. 존재하지 않은 속성명을 지정하면 예외가 발생한다.

 

getattr

 getattr은 제1인수에 지정한 오브젝트로 부터 제2인수에 지정한 이름의 속성 값을 획득한다. 오브젝트 o에 속성 a가 있다고 가정하면, "getattr(o,a)"는 "o.a"과 동일하다. 제2인수로 지정한 이름의 속성이 없다면, 제3인수로 지정해둔 그 값을 반환하고 별도로 지정해두지 않았다면 예외가 발생한다.

 

hasattr

 hasattr은 제1인수에 지정한 오브젝트에, 제2인수로 지정한 이름의 속성이 있다면 True를 없다면 False를 반환한다.

 

setattr

 setattr은 제1인수에 지정한 오브젝트에 대해 제2인수로 지정한 이름의 속성 값을 제3 인수에 지정한 값으로 설정한다. "setattr(o, a, v)"는 "o.a=v"와 동일하다.

 

 

사용예


 아래의 코드는 사용예이다.

class AttrTest:
  def __init__(self, name="", num=0):
    self.name = name  #setattr(self, "name", name)
    setattr(self, "num", num)
  def __repr__(self):
    result = ""
    for idx, value in vars(self).items():
      result += f"{idx}: {value}, "
    return result[0:-2]

at = AttrTest()

setattr(at, "name", "insider.net")
at.name = "build insider"
setattr(at, "newprop", 200)      # 신규 속성도 작성 가능(경우에 따라 다름)
print(getattr(at, "newprop"))    # 출력결과: 200
print(hasattr(at, "foo"))        # 출력결과: False
print(getattr(at, "foo"))        # 예외: AttributeError
print(getattr(at, "foo", None))  # 출력결과: None
delattr(at, "newprop")
repr(at)  # 출력결과: 'name: build insider, num: 0'

 AttrTest클래스는 __init__메소드와 __repr__메소드를 정의하여, 전자에서는 속성(인스턴스 변수)의 초기화를 하고, 후자에서는 문자열을 표현을 독자적인 방법으로 작성하고 있다. __init__메소드에서는 "self.name="과 "setattr(self,...)"이라는 두 가지 형태로 속성을 설정하고 있지만, 이미 말했지만 두 가지의 처리는 동일하다.

 클래스 정의 후에는 그 인스턴스를 작성하고, 다양한 형태로 인스턴스의 속성을 설정(setattr), 획득(getattr), 확인(hasattr), 삭제(delattr)을 실행하고 있다.

728x90