_str__ 의 의미
__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 함수를 추가해줌으로서 이름으로 데이터를 조회할 수 있게 된다.
댓글남기기