2009-11-10 69 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 2009-11-10 18:16:23

+0

@SilentGhost,感謝提示 – 2009-11-10 18:21:33

+0

是的,這正是我想到的。 – Brian 2009-11-10 22:12:38

1

在控制檯你」重新用於印刷__str__讓你的對象,這__repr__負責的表示:。

>>> 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 2009-11-10 17:59:05

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