HOWTO · Python

Python 객체의 속성을 출력하는 방법

이 튜토리얼에서는 Python 객체의 속성을 출력하는 방법을 설명합니다.

이 페이지의 내용

이름을 아는 속성은 점 표기법으로 접근한 뒤 그 값을 print()에 전달하면 출력할 수 있습니다. 이름이 문자열에 들어 있다면 getattr()을 사용하고, 저장된 인스턴스 속성을 살펴보려면 가능한 경우 __dict__나 vars()를 사용하세요. 객체에서 확인할 수 있는 이름을 폭넓게 알아보려면 dir()을 사용할 수 있습니다. 각 방법은 객체를 서로 다른 관점에서 보여 주므로, 필요한 것이 하나의 값인지, 인스턴스의 매핑인지, 더 넓은 이름 목록인지에 따라 선택하면 됩니다.

Person 클래스는 클래스 속성을 정의할 수 있으며, 각 객체는 자신만의 인스턴스 속성도 저장할 수 있습니다. 아래 예제에서는 이름, 나이, 도시를 가진 사람 객체를 만듭니다.

Python에서 print와 속성 접근으로 객체 속성 출력하기

속성 이름을 알고 있다면 점 표기법으로 값을 읽는 것이 가장 직접적인 방법입니다. 값을 내장 print() 함수에 전달하세요.

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(person.name)
John Doe

이 표현식은 해당 인스턴스에서 name을 읽고 그 값을 표준 출력으로 보냅니다.

Python에서 getattr 함수로 객체 속성 출력하기

속성 이름이 변수에 저장되어 있거나 실행 중에 결정된다면 getattr()을 사용하세요. 두 번째 인수는 문자열이어야 합니다. 선택 사항인 세 번째 인수는 해당 이름을 사용할 수 없을 때 대신 반환할 값을 지정합니다. 대체값을 생략하면 속성이 없을 때 AttributeError가 발생합니다.

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attribute_name = "city"
city = getattr(person, attribute_name, "Unknown")
print(city)
New York

attribute_name을 바꾸면 다른 속성을 선택할 수 있고, 기본값도 애플리케이션에 맞게 변경할 수 있습니다. 세 번째 인수를 전달하지 않은 상태에서 이름이 없으면 AttributeError가 발생합니다.

Python에서 __dict__ 속성으로 객체 속성 출력하기

인스턴스가 __dict__를 제공하는 경우, 이 속성은 해당 인스턴스의 속성 매핑입니다. 여기에는 __init__에서 self.name에 할당한 값처럼 인스턴스에 저장된 속성이 들어 있습니다. 클래스에만 정의된 속성은 포함하지 않습니다.

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attributes = person.__dict__
print(attributes["name"])
John Doe

__slots__를 사용하면서 딕셔너리를 두지 않는 클래스의 인스턴스 등 일부 객체는 인스턴스 __dict__를 제공하지 않습니다. 따라서 이 방법을 모든 객체에 사용할 수 있는 것은 아닙니다.

Python에서 dir() 함수로 객체 속성 출력하기

dir(person)을 호출하면 Python이 살펴볼 수 있도록 제공하는 이름을 정렬된 목록으로 얻습니다. 이 목록에는 인스턴스 및 클래스 속성, 메서드, 특수 이름이 포함될 수 있으므로 저장된 인스턴스 데이터만 나열하는 것은 아닙니다. 목록이 길어 읽기 어려운 경우 표준 라이브러리의 pprint() 함수를 사용해 보기 좋게 표시할 수 있습니다.

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print("name" in dir(person))
True

이 검사는 name이 확인 가능한 이름에 포함되어 있음을 보여 줍니다. 정확한 이름은 객체와 그 클래스에 따라 달라지며, 사용자 정의 __dir__()가 dir()의 반환값에 영향을 줄 수도 있습니다. 따라서 dir()은 인스턴스 딕셔너리의 사본이 아니라 이름을 찾아보는 도구로 사용하세요. 전체 목록을 읽기 쉬운 형태로 보려면 dir(person)을 pprint() 함수에 전달하면 됩니다.

Python에서 vars() 함수로 객체 속성 출력하기

__dict__를 제공하는 객체에 vars(person)을 호출하면 해당 인스턴스 속성 매핑을 반환합니다. 이 매핑을 pprint()에 전달하면 읽기 좋게 표시할 수 있습니다.

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(vars(person)["name"])
John Doe

인수 없이 vars()를 호출하는 것은 용도가 다릅니다. 이 경우 현재 지역 기호 테이블을 반환합니다. __dict__가 없는 객체를 전달하면 TypeError가 발생하므로, 객체가 인스턴스 매핑을 제공한다는 것을 알고 있을 때 사용하세요. 전체 매핑을 보기 좋게 출력하려면 vars(person)을 pprint() 함수에 전달하면 됩니다.

결론

작업에 맞는 방법을 선택하세요. 하나의 값을 알고 있다면 점 표기법과 print()를 사용하고, 속성 이름이 실행 중에 정해진다면 getattr()을 사용하세요. 객체가 딕셔너리를 제공할 때 저장된 인스턴스 속성을 보려면 __dict__나 vars()를 사용하고, 더 넓은 이름 목록을 찾으려면 dir()을 사용하면 됩니다. dir()에는 메서드와 특수 이름도 포함될 수 있지만, 인스턴스 딕셔너리에는 해당 인스턴스에 저장된 속성만 들어 있다는 점을 기억하세요.