更改类实例在屏幕上返回的内容

时间:2014-06-16 23:00:15

标签: python

假设我有一个班级Hello,我会做以下事情:

>> a = Hello()
>> a

这将返回以下内容:

<__main__.Hello instance at 0x123abc>

如何更改类以返回其他内容(例如实例变量)?

2 个答案:

答案 0 :(得分:2)

添加:

class Hello(object):

    def __str__(self):
        return "HI"

    def __repr__(self):
        return "Hi"


>>> a = Hello()
>>> a           --> calls __repr__ method
Hi        
>>> print a     --> calls __str__ method
HI 

答案 1 :(得分:2)

为了回答被问到的 EXACT 问题,您要问的是“更改通过调用类返回的内容”,大致是元类的语义。

因此,为了论证,我们假设我们想要一个看起来像这样的类:

class Foo(object):
    __metaclass__ = MyMeta
    def __init__(self, bar):
        print "Hello from", self
        self.bar

实际上满足:

>>> myBar = object()
>>> myFoo = Foo(myBar)
Hello from <__main__Foo object at 0x...>
>>> myFoo is myBar
True

具体来说,我们有一个真正的类,它在被调用时真的被实例化,但返回值是其他东西,我们可以这样做,只要MyMeta看起来像这样:

class MyMeta(type):
    def __call__(cls, *args, **kwargs):
        self = super(MyMeta, cls).__call__(*args, **kwargs)
        return self.bar

当然,我不会这样做。