programing

print()를 사용하여 클래스의 인스턴스를 인쇄하려면 어떻게 해야 합니까?

kingscode 2023. 1. 22. 22:43
반응형

print()를 사용하여 클래스의 인스턴스를 인쇄하려면 어떻게 해야 합니까?

print클래스의 인스턴스는 다음과 같은 출력을 얻을 수 있습니다.

>>> class Test():
...     def __init__(self):
...         self.a = 'foo'
...
>>> print(Test())
<__main__.Test object at 0x7fc9a9e36d60>

클래스 및 해당 인스턴스의 인쇄 동작(또는 문자열 표현)을 정의하려면 어떻게 해야 합니까?예를 들어, 위의 코드를 참조할 때, 어떻게 수정하면Test class so so so so so so so so so soprint는 ""를 .a 가치, 가치, 가치

>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test

메서드는 인쇄 시 발생하는 현상이고 메서드는 함수를 사용할 때(또는 인터랙티브프롬프트로 확인할 때) 발생하는 현상입니다.

'아니오'의 경우__str__은 Python의 합니다.__repr__ 」를 하면, 「 」__str__ 아니다__repr__의 Python을 __repr__, 「」를 하고 있습니다__str__인쇄를 위해.

Chris Lutz의 설명에 따르면 이는__repr__방법을 가르쳐 주세요.

의 매뉴얼에 기재되어 있습니다.

이 는 " "에 되었을 때 합니다.eval()그 이외의 경우는 오브젝트 타입의 이름과 대부분의 경우 오브젝트의 이름 및 주소를 포함한 추가 정보를 포함하는 꺽쇠 괄호로 둘러싸인 문자열은 문자열입니다.는 이 할 수 이 경우 클래스는 이 함수의 반환 내용을 합니다.__repr__()★★★★★★ 。

다음 클래스의 테스트:

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return f"<Test a:{self.a} b:{self.b}>"

    def __str__(self):
        return f"From str method of Test: a is {self.a}, b is {self.b}"

..Python 쉘에서는 다음과 같이 동작합니다.

>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print(repr(t))
<Test a:123 b:456>
>>> print(t)
From str method of Test: a is 123, b is 456
>>> print(str(t))
From str method of Test: a is 123, b is 456

'아니오'의 경우__str__정의되어 있습니다.print(t) (오류)print(str(t))합니다.__repr__ 대신에

'아니오'의 경우__repr__method가 정의되고 기본값이 사용됩니다.이것은 대략 다음과 같습니다.

def __repr__(self):
    cls = self.__class__
    return f"<{cls.__module_}.{cls.__qualname__} object at {id(self)}>"

특정 포맷 없이 모든 클래스에 적용할 수 있는 일반적인 방법은 다음과 같습니다.

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return str(self.__class__) + ": " + str(self.__dict__)

그리고 나서.

elem = Element('my_name', 'some_symbol', 3)
print(elem)

생산하다

__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}

@Keith와 같은 상황이라면 다음을 시도해 볼 수 있습니다.

print(a.__dict__)

이것은 내가 생각하는 좋은 스타일에 반하는 것이지만, 만약 당신이 디버깅을 하려고 한다면 그것은 당신이 원하는 것을 할 것이다.

@user394430에 의한 응답의 보다 예쁜 버전

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))

elem = Element('my_name', 'some_symbol', 3)
print(elem)

이름과 값의 좋은 목록을 시각적으로 생성합니다.

<class '__main__.Element'>
name = my_name
symbol = some_symbol
number = 3

보다 고급 버전(Thanks Ruud)은 다음 항목을 정렬합니다.

def __str__(self):
    return  str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))

Python 3의 경우:

특정 형식이 중요하지 않은 경우(디버깅 등) 아래의 인쇄 가능 클래스에서 상속하십시오.모든 객체에 코드를 쓸 필요가 없습니다.

이 답변에 영감을 받아

class Printable:
    def __repr__(self):
        from pprint import pformat
        return "<" + type(self).__name__ + "> " + pformat(vars(self), indent=4, width=1)

# Example Usage
class MyClass(Printable):
    pass

my_obj = MyClass()
my_obj.msg = "Hello"
my_obj.number = "46"
print(my_obj)

@dbr의 답변에 제 의견을 덧붙이자면, 그가 인용한 공식 문서에서 이 문장을 구현하는 예를 다음에 제시하겠습니다.

"[...] - eval로 전달될 때 동일한 값의 개체를 생성하는 문자열을 반환합니다. [...]

이 클래스 정의 지정:

class Test(object):
    def __init__(self, a, b):
        self._a = a
        self._b = b

    def __str__(self):
        return "An instance of class Test with state: a=%s b=%s" % (self._a, self._b)

    def __repr__(self):
        return 'Test("%s","%s")' % (self._a, self._b)

이제 의 인스턴스를 쉽게 시리얼화할 수 있습니다.Test클래스:

x = Test('hello', 'world')
print 'Human readable: ', str(x)
print 'Object representation: ', repr(x)
print

y = eval(repr(x))
print 'Human readable: ', str(y)
print 'Object representation: ', repr(y)
print

마지막 코드를 실행하면 다음과 같은 결과가 나옵니다.

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

하지만 마지막 코멘트에서 말씀드렸듯이, 더 많은 정보가 여기에 있습니다.

간단해, 인쇄물에서는, 다음과 같이 해.

print(foobar.__dict__)

건설자가 있는 한

__init__

를 사용해야 합니다.__repr__이것은 다음과 같은 표준 함수입니다.__init__. 예:

class Foobar():
    """This will create Foobar type object."""

    def __init__(self):
        print "Foobar object is created."

    def __repr__(self):
        return "Type what do you want to see here."

a = Foobar()

print a

__repr__그리고.__str__이미 많은 답변에 언급되어 있습니다.만약 당신이 귀찮아서 이 마법 기능을 수업에 추가할 수 없다면 objprint를 사용해도 된다는 것을 덧붙이고 싶습니다.심플한 데코레이터@add_objprint추가에 도움이 됩니다.__str__method to your class, 그리고 당신은 사용할 수 있습니다.print예를 들어.물론 괜찮으시다면,objprint임의의 오브젝트를 사람이 읽을 수 있는 형식으로 인쇄합니다.

from objprint import add_objprint

class Position:
    def __init__(self, x, y):
        self.x = x
        self.y = y

@add_objprint
class Player:
    def __init__(self):
        self.name = "Alice"
        self.age = 18
        self.items = ["axe", "armor"]
        self.coins = {"gold": 1, "silver": 33, "bronze": 57}
        self.position = Position(3, 5)

print(Player())

출력은 다음과 같습니다.

<Player
  .name = 'Alice',
  .age = 18,
  .items = ['axe', 'armor'],
  .coins = {'gold': 1, 'silver': 33, 'bronze': 57},
  .position = <Position
    .x = 3,
    .y = 5
  >
>

이 스레드에는 이미 많은 해답이 있지만 특별히 도움이 되는 것은 없고, 스스로 풀어야 했기 때문에 조금 더 도움이 되었으면 합니다.

수업이 끝날 때 괄호가 있는지 확인만 하면 됩니다. 예:

print(class())

다음은 제가 작업하던 프로젝트의 코드 예입니다.

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number
    def __str__(self):
        return "{}: {}\nAtomic Number: {}\n".format(self.name, self.symbol, self.number

class Hydrogen(Element):
    def __init__(self):
        super().__init__(name = "Hydrogen", symbol = "H", number = "1")

수소 클래스를 인쇄하기 위해 다음을 사용했습니다.

print(Hydrogen())

이 작업은 Hydrogen 끝에 괄호가 없으면 작동하지 않습니다.그들은 필요하다.

도움이 되길 바라며, 더 궁금한 점이 있으면 알려주세요.

이것은 오래된 투고이지만, 데이터 클래스(Python 3.7)에 도입된 매우 편리한 방법도 있습니다.기타 특수 기능(예:__eq__그리고.__hash__, 이 기능을 제공합니다.__repr__클래스 속성의 함수.예를 들면 다음과 같습니다.

from dataclasses import dataclass, field
@dataclass
class Test:
    a: str = field(default="foo")
    b: str = field(default="bar")

t = Test()
print(t) 
# prints Test(a='foo', b='bar')

특정 속성이 출력되지 않도록 숨기려면 필드 데코레이터 매개 변수를 설정할 수 있습니다.repr로.False:

@dataclass
class Test:
    a: str = field(default="foo")
    b: str = field(default="bar", repr=False)

t = Test()
print(t) 
# prints Test(a='foo')

언급URL : https://stackoverflow.com/questions/1535327/how-to-print-instances-of-a-class-using-print

반응형