代码之家  ›  专栏  ›  技术社区  ›  Brian

python_uuu str_uuuu:魔法控制台

  •  0
  • Brian  · 技术社区  · 16 年前

    假设有人决定(是的,这很可怕)以如下方式创建句柄输入:在导入类之后,在Python控制台上的命令中输入一个用户,该命令实际上是一个类名,类名是 __str__ 函数实际上是一个有副作用的函数(例如,命令是“north”,函数会更改一些全局变量,然后返回描述当前位置的文本)。显然这是一件愚蠢的事情,但你会怎么做(如果可能的话)?

    请注意,基本问题是如何定义 阿尔法 没有创建类实例的类的方法,否则它会很简单(但仍然很疯狂:

    class ff:
        def __str__(self):
            #do fun side effects
            return "fun text string"
    
    ginst = ff()
    
    >>ginst
    
    3 回复  |  直到 16 年前
        1
  •  5
  •   Nadia Alramli    16 年前

    你要找的是元类

    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
  •  1
  •   SilentGhost    16 年前

    在控制台中,您将获得对象的表示,其中 __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
    
        3
  •  0
  •   Corey Porter    16 年前

    您可以使用类的实例,而不是类本身。类似的东西

    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