ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] getattr 내장 메서드, 함수 이름으로 호출하기
    programming/python 2022. 7. 5. 23:07

    1. getattr이란?

    1-1) attr

    attribute의 약어로 클래스 내부에 포함돼 있는 메서드변수를 의미합니다.

    그러므로 getattr이라는 내장함수는 클래스 내부에 있는 메서드나 변수를 가져온다는 의미로 해석하면 되겠습니다.

    1-2) help(getattr)

    내장 함수이며 getattr(객체, 이름) -> 값

    객체내에 명명된 '이름'이라는 속성을 가져옵니다. getattr(x,'y')는 x.y와 같습니다.

    만약 getattr(x,'y', default)로 설정하여 속성 값 'y'가 없다면 default를 출력할 것 입니다.

    Help on built-in function getattr in module builtins:
    
    getattr(...)
        getattr(object, name[, default]) -> value
        
        Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
        When a default argument is given, it is returned when the attribute doesn't
        exist; without it, an exception is raised in that case.

    2.예제

    #human클래스를 만들어서 나이, 무게 눈, 발의 정보를 만들 것 입니다.

    class human():
        def __init__(self):
            self.age = 0
            self.weight = 4.0
            self.eyes = 2
            self.foots = 2
    kim = human()

    # kim의 정보를 출력하기 

    1번 - 하나 하나 확인하기

    print("1번 예시")
    print(kim.age)
    print(kim.weight)
    print(kim.eyes)
    print(kim.foots)
    print(kim.sex) #없는 속성 값 넣어보기
    1번 예시
    0
    4.0
    2
    2
    AttributeError

    human 클래스의 속성 값들이 더 많아지고 kim과 같은 객체의 수가 많아진다면 코드의 양은 무시 못 할 것입니다.

    또한 코드의 간략하게 만들어 양도 줄이고 가독성을 늘릴 수 있다면 안 쓸 이유가 없겠습니다.

    getattr 함수 사용의 예시입니다.

     

    2번 - for문과 getattr 사용하기

    print('2번 예시')
    for i in ['age','weight','eyes', 'foots', 'tall']:
        print(getattr(kim, i, '그런 속성 값은 없습니다.'))
    2번 예시
    0
    4.0
    2
    2
    그런 속성 값은 없습니다.

     

    3. 실전 활용

    저는 뷰티풀수프를 사용하여 크롤링 프로젝트로 여러 사이트들을 돌아다니며 정보를 수집하는 코드들을 작성하는데

    같은 코드의 반복이 눈에 거슬려 하나의 함수로 만들기 위한 과정에서 문제 발생으로 검색과 질문을 통해 해결하였습니다.

    import requests
    from bs4 import BeautifulSoup
    
    def scrap(url, function, *lst):
        result = requests.get(url)
        soup = BeautifulSoup(result.text, "lxml")
        #######################################
        article = getattr(soup, function)(*lst)
        #######################################
        return article
        
    dct = {
    	'naver' : {
        	'url' : 'https://www.naver.com',
            'function' : 'find_all',
            'lst' : ['a', {'class' : 'main_log']
        },
        'daum' : {
        	'url' : 'https://www.daum.com',
            'function' : 'select',
            'lst' : ['ul.main-list span.comment']
        }
    }
    for i in dct:
    	print(test(i["url"], i["function"], i["lst"])

    How do I call the functions of the imported library from my function?

    댓글

Designed by Tistory.