【问题标题】:Change what is returned on screen by class instance [closed]更改类实例在屏幕上返回的内容[关闭]
【发布时间】:2023-04-01 20:28:01
【问题描述】:

假设我有一个班级你好,我做了以下事情:

>> a = Hello()
>> a

这将返回以下内容:

<__main__.Hello instance at 0x123abc>

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

【问题讨论】:

  • 您对此有何打算?然后尝试从该类中调用一个函数!
  • 为什么要让类调用返回非类的东西?
  • 没有理由,只是想知道

标签: python


【解决方案1】:

添加:

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 

【讨论】:

  • 这不会改变 Hello() 返回的内容。
  • @IsmailBadawi,我还没有完成编辑。
  • 这仍然不会改变Hello() 返回的内容,只会改变显示的内容。
  • 这是正确的。 Hello() 无法返回实例变量
  • @IsmailBadawi 好吧,我认为这就是他想要实现的目标。
【解决方案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

当然,我不会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 2015-01-20
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多