<질문>
이 클래스를 고려하십시오.
class foo(object):
pass
기본 문자열 표현은 다음과 같습니다.
>>> str(foo)
""
이 디스플레이를 사용자 지정 문자열로 만들려면 어떻게해야합니까?
<답변1>
도구__str__()
또는__repr__()
클래스의 메타 클래스에서.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
사용하다__str__
읽을 수있는 문자열 화를 의미하는 경우__repr__
모호하지 않은 표현을 위해.
<답변2>
class foo(object):
def __str__(self):
return "representation"
def __unicode__(self):
return u"representation"
<답변3>
다음 중에서 선택해야하는 경우__repr__
또는__str__
기본 구현으로 첫 번째로 이동__str__
전화__repr__
정의되지 않았을 때.
Custom Vector3 예제 :
class Vector3(object):
def __init__(self, args):
self.x = args[0]
self.y = args[1]
self.z = args[2]
def __repr__(self):
return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z)
def __str__(self):
return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z)
이 예에서repr
직접 사용 / 실행할 수있는 문자열을 다시 반환하는 반면str
디버그 출력으로 더 유용합니다.
v = Vector3([1,2,3])
print repr(v) #Vector3([1,2,3])
print str(v) #x:1, y:2, z:3
<답변4>
Ignacio Vazquez-Abrams' approved answer아주 맞습니다. 그러나 Python 2 세대입니다. 현재 최신 Python 3에 대한 업데이트는 다음과 같습니다.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object, metaclass=MC):
pass
print(C)
Python 2와 Python 3 모두에서 실행되는 코드를 원하는 경우six모듈에서 다룬 내용 :
from __future__ import print_function
from six import with_metaclass
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(with_metaclass(MC)):
pass
print(C)
마지막으로, 커스텀 정적 repr을 원하는 클래스가 하나 있다면 위의 클래스 기반 접근 방식이 훌륭하게 작동합니다. 그러나 여러 개가있는 경우 다음과 유사한 메타 클래스를 생성해야합니다.MC
각각에 대해 지루할 수 있습니다. 이 경우 메타 프로그래밍을 한 단계 더 발전시키고 메타 클래스 팩토리를 생성하면 상황이 좀 더 깔끔해집니다.
from __future__ import print_function
from six import with_metaclass
def custom_class_repr(name):
"""
Factory that returns custom metaclass with a class ``__repr__`` that
returns ``name``.
"""
return type('whatever', (type,), {'__repr__': lambda self: name})
class C(with_metaclass(custom_class_repr('Wahaha!'))): pass
class D(with_metaclass(custom_class_repr('Booyah!'))): pass
class E(with_metaclass(custom_class_repr('Gotcha!'))): pass
print(C, D, E)
인쇄물:
Wahaha! Booyah! Gotcha!
메타 프로그래밍은 일반적으로 매일 필요한 것이 아닙니다. 그러나 필요할 때 실제로 그 자리를 차지합니다!
<답변5>
모든 훌륭한 답변에 장식이있는 내 버전을 추가하면됩니다.
from __future__ import print_function
import six
def classrep(rep):
def decorate(cls):
class RepMetaclass(type):
def __repr__(self):
return rep
class Decorated(six.with_metaclass(RepMetaclass, cls)):
pass
return Decorated
return decorate
@classrep("Wahaha!")
class C(object):
pass
print(C)
stdout :
Wahaha!
아래쪽 :
- 선언 할 수 없습니다.
C
슈퍼 클래스없이 (아니class C:
) C
인스턴스는 이상한 파생의 인스턴스가 될 것입니다. 따라서__repr__
인스턴스도 마찬가지입니다.
'개발 > Python' 카테고리의 다른 글
'str'개체에는 'decode'속성이 없습니다. 파이썬 3 오류? (0) | 2021.01.08 |
---|---|
Python csv에서 list 가져 오기 (0) | 2021.01.08 |
Django의 Meta 클래스는 어떻게 작동합니까? (0) | 2021.01.08 |
Python에서 빈 리스트 만들기 (0) | 2021.01.07 |