Класс печати не работает [дубликат]

  1. Всегда пытайтесь отправлять заголовки в почтовую функцию.
  2. Если вы отправляете почту через localhost, тогда выполните настройки smtp для отправки почты.
  3. Если вы отправляете почту через затем проверьте, включена ли функция отправки электронной почты на вашем сервере.
382
задан Mridang Agarwalla 24 April 2016 в 12:35
поделиться

10 ответов

Ничто из этого не помогает мне. Я не хочу изменять определение моего исходного объекта только для печати. IOW: я не хочу использовать наследование или даже ставить эти функции str в моем классе. Это означало бы, что мне придется менять каждый класс, который я хочу отлаживать. Вместо этого я предпочел бы иметь класс и распечатать все содержимое класса. IOW: есть что-то вроде

class Address( ):
  __init__( self )
     self.mName = 'Joe'
     self.mAddress = '123 Easy Street'

a = Address()
print a
or
print printClass( a )

Это напечатает что-то вроде:

 Class Address contains:
   mName = 'Joe'
   mAddress = '123 Easy Street'

Приятно и просто по использованию и идея, когда мне не нужно менять оригинал объектов. Если мне нужно создать небольшую функцию, которая деконструирует объект, я бы с этим справился. Так как я могу просто вызвать функцию, которая знает, как это сделать. Я могу использовать его inline, не изменяя определение исходных классов.

-2
ответ дан coder 20 August 2018 в 19:38
поделиться

Для Python 3:

Если конкретный формат не имеет значения (например, для отладки), просто наследуйте от класса Printable ниже. Не нужно писать код для каждого объекта.

Вдохновленный этот ответ

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)
12
ответ дан Community 20 August 2018 в 19:38
поделиться

Более красивая версия ответа от пользователя @ 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

Сортировка даже более благоприятной версии (спасибо Ruud) пункты:

def __str__(self):
    return  str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))
4
ответ дан MikeyB 20 August 2018 в 19:38
поделиться

Вам нужно использовать __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
11
ответ дан Robᵩ 20 August 2018 в 19:38
поделиться
  • 1
    repr и str имеют разную семантику: repr должен быть источником Python, который бы (повторно) создал тот же объект - это его repr представление в коде; str должна быть красивой пользовательской строкой объекта. – Eric Towers 12 July 2017 в 00:04

Как упоминал Крис Лутц , это определяется методом __repr__ в вашем классе.

Из документации repr() :

Для многих типов эта функция пытается вернуть строку, которая даст объект с тем же значением при передаче в eval(), иначе представление представляет собой строку, заключенную в угловые скобки, которая содержит имя типа объекта вместе с дополнительной информацией, часто включающей имя и адрес объекта. Класс может управлять тем, что эта функция возвращает для своих экземпляров, определяя метод __repr__().

Учитывая следующий класс Test:

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

    def __repr__(self):
        return "<Test a:%s b:%s>" % (self.a, self.b)

    def __str__(self):
        return "From str method of Test: a is %s, b is %s" % (self.a, 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__ не задан, используется значение по умолчанию, которое в значительной степени эквивалентно ..

def __repr__(self):
    return "<%s instance at %s>" % (self.__class__.__name__, id(self))
100
ответ дан Steven Vascellaro 20 August 2018 в 19:38
поделиться
  • 1
    +1, но ваш код __str__ вашего класса отличается от результатов интерактивной оболочки, которые вы даете. :П – Chris Lutz 8 October 2009 в 04:05
  • 2
    Err, oops .. ручная модификация выхода REPL никогда не заканчивается. Вероятно, я должен учить свои должности: P – dbr 8 October 2009 в 04:29
  • 3
    существует также метод unicode , который вы можете использовать вместо Str ; обратите внимание, что он должен возвращать объект unicode, а не строку (но если вы вернете строку, преобразование в unicode будет выполнено в любом случае ...) – kender 8 October 2009 в 06:32
  • 4
    @kender - я не знал об этом, но в ретроспективе это имеет смысл, учитывая, что Python 2.x сломал Unicode-обработку. – Chris Lutz 8 October 2009 в 06:36
  • 5
    Форматирование строки % не устарело, из docs.python.org/whatsnew/2.6.html "оператор% дополнен более мощным форматированием строк метод, формат () " – dbr 8 October 2009 в 15:32
  • 6
    ДБ: Это правда. Обратите внимание, что «Что нового в Python 3.0» doc также говорит, что метод format () [...] План должен в конечном итоге сделать это единственным API для форматирования строк и начать осуждать оператор% в Python 3.1. & quot; – Ashwin Nanjappa 9 October 2009 в 07:03
  • 7
    Питти, % было очень удобно. – Janusz Lenar 12 December 2011 в 23:28
  • 8
    Я думаю, что этот ответ не может быть завершен без ссылки на этого другого ! – Antonio Alvarado Hernández 20 December 2012 в 13:15
  • 9
    Спас меня! Однако, после повторного внедрения метода __repr __ (self), печать будет вводить пользователей в заблуждение. Знаете ли вы о каких-либо передовом опыте? – Viet 5 July 2013 в 04:25
  • 10
    Для Java-программистов: __str __ (self) похож на toString () в мире python – Janac Meena 18 July 2016 в 20:30

В этой теме уже много ответов, но никто из них не помог мне, я должен был сам это обработать, поэтому я надеюсь, что это немного более информативно.

У вас просто есть чтобы убедиться, что у вас есть круглые скобки в конце вашего класса, например:

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. Они необходимы.

Надеюсь, это поможет, дайте мне знать, если у вас возникнут вопросы.

1
ответ дан Stumpy 20 August 2018 в 19:38
поделиться

Общий способ, который может быть применен к любому классу без специального форматирования, может быть выполнен следующим образом:

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}
16
ответ дан user394430 20 August 2018 в 19:38
поделиться
  • 1
    Это должно быть опубликовано где-то в справочном руководстве ... отличный ответ. – MikeyB 14 March 2018 в 16:30

просто используйте специальный метод «__str__» внутри вашего класса. Для класса

Адипрограмм:

def __init__(self, name):
    self.company_name = name

def __str__(self):
    return "I am the Founder of Adiprogrammer!"

yash = Адипрограммер («Aaditya»)

print (yash)

1
ответ дан Yash Tile 20 August 2018 в 19:38
поделиться

Чтобы добавить мои два цента к ответу @ 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)

Now , легко сериализовать экземпляр класса 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")

Но, как я уже сказал в моем последнем комментарии: больше информации просто здесь !

12
ответ дан Community 20 August 2018 в 19:38
поделиться
1
ответ дан John 31 October 2018 в 14:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: