1 분 소요

__str__

파이썬 내장 함수인 __str__(이하 ‘str함수’) 을 간단히 알아보자.

모든 클래스에 존재한다.

str 함수는 모든 클래스의 내장 함수로서 __name__ 과 같이 항상 존재한다.

지독하게 OOP인 python 은 모든 자료형이 클래스이고 사용자가 만든 변수들은 해당 클래스의 인스턴스라고 볼 수 있다.

그렇게 모든 자료형 인스턴스 즉 변수에도 str함수를 포함하고 있다.

한번 확인해보자

a= []
b = 1


print(dir(a))
print(dir(b))
['__add__', '__class__', ... , '__str__', ...]

['__abs__', '__add__', ... , '__str__', ...]

역시는 역시 존재한다.

존재 이유

str 함수의 존재 이유가 뭘까 ?

str 함수는 사용자를 위해 객체를 문자열로 설명해주기위한 함수이다.

class Hello :
    pass



cls1= Hello()

print(cls1)
<__main__.Hello object at 0x0000021EFAFE0F70>

인스턴스를 출력할 때 default 론 클래스 명과 메모리 주소에 대한 정보가 출력된다.

하지만 str 함수로 해당 클래스에 대한 설명을 정의해주면 다르다.


class Hello :
    def __str__(self):
        return "헬로클래스입니돵~!"



cls1= Hello()

print(cls1)

헬로클래스입니돵~!

짜잔 이제 우리는 클래스에 str 함수를 추가함으로서 수 많은 인스턴스 속에서도 해당 인스턴스가 어떤 클래스의 인스턴스 인지 확인하거나, 원하는 정보를 출력할 수 있다.

장고에서의 str 함수

장고에서도 str 함수는 요긴하게 쓰인다.

가장 대표적으로 쓰이는 곳은 admin 에서 데이터를 조회할 때 리스트 정보를 변경하기 위하여 사용한다.

# models.py

#...
#...
class Person(models.Model):
    name = models.TextField()
    address = models.TextField()
# admin.py 

#...
#...

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    pass

위 코드처럼 admin 과 model 코드가 작성 되어 있다면 admin 페이지에서 Person 모델에 대한 데이터들을 조회할 수 있다.

조회 결과는 Person.object(PK넘버) 라고 출력될 것이다.

이는 장고에서 모델 객체(인스턴스)의 str 함수 defalut 가 저렇게 정의 되었기 때문이다.

문제는 pk넘버 만으론 해당 데이터를 식별하기 어렵다.

이름으로 데이터들을 조회하고 싶다면 str 함수로 반환값을 변경해주면 된다.

# models.py

#...
#...
class Person(models.Model):
    name = models.TextField()
    address = models.TextField()
    
    def __str__(self):
        return self.name

이렇게 str 함수를 추가해줌으로서 이름으로 데이터를 조회할 수 있게 된다.

댓글남기기