2015-05-19 3 views
-1

У меня есть пользовательский класс, как:Магический метод Python для представления класса?

class foo(object): 
    def __init__(self, name): 
     self.__name = name 

    def get_name(self): 
     return self.__name 

То, что я хочу сделать, это написать

test = foo("test") 
    print test 

вместо

test = foo("test") 
print test.get_name() 

Что такое магия способ сделать это?

+0

См. [Здесь] (http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python). Кроме того, ваш опубликованный код кажется ошибочным ('' foo(). Get_name() ''). –

+1

Я не уверен, почему это привлекает «непонятно, что вы просите» голосов: вопрос совершенно ясен. У Python есть хотя бы один метод (фактически два), который вызывается, когда требуется строковое представление класса, и OP знает, что он существует, но не его имя. – GreenAsJade

+0

@AmiTavory хороший указатель на 'str' vs' repr', но я не уверен, что не так с кодом OP. Parens нужны только для операторов печати в python3. – GreenAsJade

ответ

3

Есть два способа, которые имеют отношение. Существует метод __str__, который «замаскирует» ваш объект в строку. Затем существует метод __repr__, который преобразует ваш объект в «представление программиста». Функция print (или оператор, если вы используете Python 2), использует функцию str для преобразования объекта в строку и затем записывает его в sys.stdout. str получает представление строки, сначала проверяя метод __str__, и если он терпит неудачу, то метод __repr__. Вы можете реализовать их на основе вашего удобства, чтобы получить то, что вы хотите.

В вашем собственном случае реализации

def __str__(self): 
    return self.__name 

должно быть достаточно.

+0

спасибо за это полное объяснение. Если я правильно вас понял, это означает, что метод '__str__' будет использоваться только в том случае, если функция (например,' print') нуждается в строчном представлении этого класса. Итак, в моем примере это не проблема, если я пишу 'f = foo ('test'); i = foo ('i'); i = f; 'чем' i' является 'f', а не только имя' i' изменено ?! – alabamajack

+0

После ряда операторов 'i' и' f' указывают на один и тот же объект (в этом случае 'foo ('test')'). Объект 'foo ('i')' теперь ни к чему не привязан. –

1

Вы должны реализовать __str__

class foo(object): 
    def __init__(self, name): 
     self.__name = name 

    def get_name(self): 
     return self.__name 

    def __str__(self): 
     return self.get_name() 

f = foo("My name") 

print f 
1

Вы должны переопределить __str__() метод как это:

class b: 
    def __str__(self) 
      return "hello" 

n = b() 

print n 
hello