Какой метод вызывается, когда объект отображается в списке? [Дубликат]

Для тех, кто не хочет использовать внешние почтовые программы и хочет отправлять почту () на выделенный Linux-сервер.

Способ, как php-сообщения, описаны в php.ini в разделе [mail function] , Параметр sendmail-path описывает, как вызывается sendmail. Значение по умолчанию - sendmail -t -i, поэтому, если вы заработаете sendmail -t -i < message.txt в консоли linux, вы сделаете это. Вы также можете добавить mail.log для отладки и убедиться, что почта действительно вызвана.

Различные MTA могут реализовать sendmail, они просто делают символическую ссылку на свои двоичные файлы на это имя. Например, в debian default используется postfix. Настройте свой MTA для отправки почты и протестируйте ее с консоли с помощью sendmail -v -t -i < message.txt. Файл message.txt должен содержать все заголовки сообщения и тело, адресаты назначения для конверта будут взяты из заголовка To:. Пример:

From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

Я предпочитаю использовать ssmtp как MTA, потому что он прост и не требует запуска демона с открытыми портами. ssmtp подходит только для отправки почты с локального хоста, он также может отправлять аутентифицированную электронную почту через вашу учетную запись в общедоступной почтовой службе. Установите ssmtp и отредактируйте конфигурацию /etc/ssmtp/ssmtp.conf. Чтобы иметь возможность также получать локальную системную почту для учетных записей unix (например, оповещения для root из заданий cron), настройте файл /etc/ssmtp/revaliases.

Вот моя конфигурация для моей учетной записи в почте Yandex:

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password
383
задан 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 21 August 2018 в 19:18
поделиться

Для 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 21 August 2018 в 19:18
поделиться

Более красивая версия ответа от пользователя @ 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 21 August 2018 в 19:18
поделиться

Вам нужно использовать __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ᵩ 21 August 2018 в 19:18
поделиться
  • 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 21 August 2018 в 19:18
поделиться
  • 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 21 August 2018 в 19:18
поделиться

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

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 21 August 2018 в 19:18
поделиться
  • 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 21 August 2018 в 19:18
поделиться
12
ответ дан Community 4 November 2018 в 16:29
поделиться
1
ответ дан John 4 November 2018 в 16:29
поделиться
Другие вопросы по тегам:

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