假设我有一个班级Hello,我会做以下事情:
>> a = Hello()
>> a
这将返回以下内容:
<__main__.Hello instance at 0x123abc>
如何更改类以返回其他内容(例如实例变量)?
答案 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
当然,我不会这样做。