Для тех, кто не хочет использовать внешние почтовые программы и хочет отправлять почту () на выделенный 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
Ничто из этого не помогает мне. Я не хочу изменять определение моего исходного объекта только для печати. 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, не изменяя определение исходных классов.
Для 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)
Более красивая версия ответа от пользователя @ 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__)))
Вам нужно использовать __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__
в вашем классе.
Из документации 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))
__str__
вашего класса отличается от результатов интерактивной оболочки, которые вы даете. :П
– Chris Lutz
8 October 2009 в 04:05
%
не устарело, из docs.python.org/whatsnew/2.6.html "оператор% дополнен i> более мощным форматированием строк метод, формат () "
– dbr
8 October 2009 в 15:32
В этой теме уже много ответов, но никто из них не помог мне, я должен был сам это обработать, поэтому я надеюсь, что это немного более информативно.
У вас просто есть чтобы убедиться, что у вас есть круглые скобки в конце вашего класса, например:
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. Они необходимы.
Надеюсь, это поможет, дайте мне знать, если у вас возникнут вопросы.
Общий способ, который может быть применен к любому классу без специального форматирования, может быть выполнен следующим образом:
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}
просто используйте специальный метод «__str__» внутри вашего класса. Для класса
Адипрограмм:
def __init__(self, name):
self.company_name = name
def __str__(self):
return "I am the Founder of Adiprogrammer!"
yash = Адипрограммер («Aaditya»)
print (yash)