2009-11-10 58 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