2009-11-10 5 views
0

Предположим, что кто-то решил (да, это ужасно) создать ввод ввода следующим образом: пользователь вводит команду на консоли python после импорта вашего класса, эта команда на самом деле является именем класса, функция __str__ имени класса является фактически функцией с побочными эффектами (например, команда «север», и функция меняет некоторые глобальные переменные, а затем возвращает текст, описывающий ваше текущее местоположение). Очевидно, это глупая вещь, но как бы вы это сделали (если возможно)?Python __str__: Magic Console

Обратите внимание, что основной вопрос заключается в том, чтобы определить метод __str__ для класса без создания экземпляра класса, в противном случае было бы просто (но так же, как сумасшедший:

class ff: 
    def __str__(self): 
     #do fun side effects 
     return "fun text string" 

ginst = ff() 

>>ginst 

ответ

5

Что вы ищете метакласс

class Magic(type): 
    def __str__(self): 
     return 'Something crazy' 
    def __repr__(self): 
     return 'Another craziness' 

class Foo(object): 
    __metaclass__ = Magic 

>>> print Foo 
Something crazy 
>>> Foo 
Another craziness 
+2

в py3k вам нужно передать 'metaclass' в качестве ключевого слова:' class Bar (metaclass = Magic): pass', чтобы этот метод работал. – SilentGhost

+0

@SilentGhost, спасибо за примечание –

+0

Да, это то, о чем я думал. – Brian

1

в консоли вы» повторное получение представления вашего объекта, который __repr__ отвечает за __str__ используется для печати:..

>>> class A: 
    def __str__(self): 
     return 'spam' 


>>> A() 
<__main__.A object at 0x0107E3D0> 
>>> print(A()) 
spam 

>>> class B: 
    def __repr__(self): 
     return 'ham' 


>>> B() 
ham 
>>> print(B()) 
ham 

>>> class C: 
    def __str__(self): 
     return 'spam' 
    def __repr__(self): 
     return 'ham' 


>>> C() 
ham 
>>> print(C()) 
spam 
+0

Вы еще инстанцирование класса, хотя. Это не то, что было задано. – shylent

0

Вы можете использовать экземпляры класса, а не классы себя что-то вроде

class MagicConsole(object): 
    def __init__(self, f): 
     self.__f = f 

    def __repr__(self): 
     return self.__f() 

north = MagicConsole(some_function_for_north) 
south = MagicConsole(some_function_for_south) 
# etc 
Смежные вопросы