当前位置: 首页 > 面试题库 >

为什么不能用另一个函数替换Python对象的__str__方法?

易俊友
2023-03-14
问题内容

这是代码:

class Dummy(object):
    def __init__(self, v):
        self.ticker = v


def main():
        def _assign_custom_str(x):
            def _show_ticker(t):                
                return t.ticker
            x.__str__ = _show_ticker
            x.__repr__ = _show_ticker
            return x


    a = [Dummy(1), Dummy(2)]

    a1 = [_assign_custom_str(t) for t in a]
    print a1[1]
    # print a1[1].__str__ # test to if orig __str__ is replaced

我希望看到这样的输出

2

但是,我看到的是标准表示形式:

<__main__.Dummy object at 0x01237730>

为什么?


问题答案:

魔术方法只有在类型而不是对象上定义时才能保证有效。

例如:

def _assign_custom_str(x):
        def _show_ticker(self):                
            return self.ticker
        x.__class__.__str__ = _show_ticker
        x.__class__.__repr__ = _show_ticker
        return x

但是请注意,这将影响所有Dummy对象,而不仅仅是访问类的对象。



 类似资料:
  • 我正在努力找出导致这个问题的原因。我对Java和BlueJ完全陌生,但我已经研究了几个小时,无法找出问题的原因。不断收到错误消息“不兼容类型:泥水匠无法转换为学徒”。非常感谢您的帮助。 //程序的目的:创建一个混合阵列,以容纳两个不同的学徒对象——泥水匠和木匠//泥水匠和木匠//然后将每个对象的所有细节显示在屏幕上。 学徒班就是这样的

  • 我创建了以下主题、流和表: 为以上创建的主题创建表和流。 我可以看到以下数据: 我的问题: 现在我要将addressId 1(Fremont)替换为addressId 1(Detroit)。我怎么能那样做? 我还尝试打印输入到控制台的流,如票证中所述 是否将Kafka流输入打印到控制台? 只是,我可以看到下面的输出: 12:04:42.145[StreamThread-1]DEBUG org.ap

  • 我在我的单元测试中使用了sinon间谍。我正在测试的函数调用了一次间谍函数,但sinon坚持说它根本没有调用它。 正在测试的代码: 还有我的单元测试: 来自西农的消息: < li>draughts应检测显示方法:AssertError:预期displayBoard将被调用一次,但在object . assert .[as called once](node _ modules \ sinon \

  • 问题内容: 我正在ClassA中调用构造函数,如果满足特定条件,则希望使结果对象属于其他类(ClassB)。我试着更换的第一个参数__init ()(在下面的例子中“自我”) 内 __init (),但它似乎并没有做我想做的。 在主要方面: 在ClassA / init.py中: 在ClassB / init.py中: 问题答案: 您需要。(并且您还需要通过子类化使其成为一种新型类,假设您使用的是

  • 预计此函数将无法typeCheck。然而,没有解释发生这种情况的原因。在GHCI中试用时,我得到了以下输出: 为什么会出现这种情况?

  • 我使用从iPython笔记本下载CSV时建议的代码动态构建javascript代码,并在从jupyter笔记本调用时使用python中的javascript()将其传递给浏览器。代码工作得很好。如果我在python函数中嵌入相同的代码,并从同一个jupyter笔记本调用python函数,那么python中的调用Javascript()将不再有效。如何使可重用功能正常工作? 我正在Windows 1