Как распечатать экземпляры класса, используя print ()?

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

#!/usr/bin/env python2
import sys, os

def rename_dir(directory):
  print('DEBUG: rename('+directory+')')
  # rename current directory if needed
  os.rename(directory, directory.lower())
  directory = directory.lower()

  # rename children
  for fn in os.listdir(directory):
    path = os.path.join(directory, fn)
    os.rename(path, path.lower())
    path = path.lower()

    # rename children within, if this child is a directory
    if os.path.isdir(path):
        rename_dir(path)

# run program, using the first argument passed to this python script as the name of the folder
rename_dir(sys.argv[1])
452
задан martineau 18 July 2019 в 16:26
поделиться

2 ответа

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

Метод __ str __ - это то, что происходит при его печати, а метод __ repr __ - это то, что происходит при использовании repr () (или когда вы смотрите на нее в интерактивной подсказке). Если это не самый Pythonic метод, прошу прощения, потому что я тоже все еще учусь, но он работает.

Если не указан метод __ str __ , Python будет печатать вместо этого результат __ repr __ . Если вы определите __ str __ , но не __ repr __ , Python будет использовать то, что вы видите выше, как __ repr __ , но по-прежнему будет использовать __ str __ для печати.

563
ответ дан 22 November 2019 в 22:43
поделиться

Как упомянул Крис Лутц , это определяется методом __ 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))
123
ответ дан 22 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

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