카테고리 없음

스파르타 AI-8기 TIL(10/9) -> 메타프로그래밍

kimjunki-8 2024. 10. 9. 21:20
목차

1.메타프로그래밍(10/9)(coming soon)
시작하기전.......
메타프로그래밍이란?
파이썬에서 메타프로그래밍이란 코드를 작성하는 중에, 
코드 자체를 수정하거나, 추가할 수 있는 기능을 말합니다
1. getattr와 setattr
getattr와 setattr은 클래스 객채의 속성에 접근(getattr)하여 수정(setattr)하는 함수입니다!
기본 구조:
getattr : getattr(object, name[, default])
object -> 속성을 가져올 객체의 이름입니다!
name -> 속성의 이름을 문자로 넣습니다!
default -> 만약 속성이 없을 경우, 에러가 나는데, 속성의 기본값을 대체합니다!

setattr : setattr(object, name, value)
obejct -> 수정하려는 객체의 이름입니다!
name -> 수정하려는 속성의 이름입니다 
value -> 새롭게 지정할 값을 넣는 곳입니다!

 

그럼 예시를 함 만들어 볼까요?

class body:
    def __init__(self, body1, body2):
        self.body1 = body1
        self.body2 = body2
    def movement(self):
        return f'{self.body1}와 {self.body2}가 움직여요!'
my_body = body('팔', '다리')
setattr(my_body, 'body1', '손가락')
print(getattr(my_body, 'body1'))
setattr(my_body, 'body2', '발가락')
print(getattr(my_body, 'body2'))

 

여기서, body라는 클래스를 만들었고, my_body라는 객체를 생성했습니다.
자, 여기서 제가 말한 구조를 대입하면,
setattr(my_body, 'body1', '손가락')
object -> my_body(객체)
name -> 'body1' (속성의 이름 -> 인스턴트 변수)
value -> '손가락' (새롭게 지정할 값)

즉, 처음 객체에 '팔'을 넣었다면, setattr을 통해 값을 '손가락'으로 변경했습니다!
그리고 밑에 body2도 똑같은 방식으로 '발가락'으로 변경했습니다!

그렇게해서 출력을 하면,

손가락
발가락
으로 출력되는 것을 볼 수 있습니다!.

설정할 수 있으면, 지우거나 확인할 수 있는 함수도 분명히 있겠죠?

hasattr와 delattr

 

hasattr -> 특정 개체가 특정 속성을 가지고 있는지 확인합니다.
기본 구조:
hasattr(object, name)

object: 속성을 확인할 객체
name: 확인할 속성 이름 (문자열)

예시:

class body:
    def __init__(self, body1):
        self.body1 = body1
    def movement(self):
        return f'{self.body1}가 움직여요!'
my_body = body('팔')
print(hasattr(my_body, 'body1'))
이렇게, hasattr을 넣어, 'body1'라는 속성이 있는지 찾습니다.
이미 body1라는 속성이 존재하기에 True값이 출력됩니다.

delattr ->  특정 객체의 속성을 삭제하는 데 사용되는 함수입니다.
기본 구조:
delattr(object, name)

object: 속성을 삭제할 객체
name: 삭제할 속성 이름 (문자열)

예시:

class body:
    def __init__(self, body1):
        self.body1 = body1
    def movement(self):
        return f'{self.body1}가 움직여요!'
my_body = body('팔')
delattr(my_body, 'body1')
print(hasattr(my_body, 'body1'))
이렇게 delattr을 사용하여, body1이라는 속성을 제거했고, 실제로 hasattr을 사용해 찾을려고 하면, False가 출력이 됩니다.