为什么可以';我用另一个函数替换Python对象的_str____)方法吗?
代码如下:为什么可以';我用另一个函数替换Python对象的_str____)方法吗?,python,Python,代码如下: 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
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
但是请注意,这将影响所有的
虚拟对象,而不仅仅是您用来访问类的对象。只有在使用了魔法方法的情况下,才能保证它们工作
例如:
def _assign_custom_str(x):
def _show_ticker(self):
return self.ticker
x.__class__.__str__ = _show_ticker
x.__class__.__repr__ = _show_ticker
return x
但是请注意,这将影响所有的虚拟对象,而不仅仅是您用来访问类的对象。如果您想为每个实例定制\uuuuu str\uuuu
,您可以在\uuuu str\uuu
中调用另一个方法,然后定制:
class Dummy(object):
def __init__(self, v):
self.ticker = v
def __str__(self):
return self._str()
def _str(self):
return super(Dummy, self).__str__()
def main():
a1 = Dummy(1)
a2 = Dummy(2)
a1._str = lambda self=a1:"a1: %d" % self.ticker
a2._str = lambda self=a2:"a2: %d" % self.ticker
print a1
print a2
a1.ticker = 100
print a1
main()
输出为:
a1: 1
a2: 2
a1: 100
如果您想为每个实例定制\uuuuu str\uuuuu
,可以在\uuuuu str\uuuu
中调用另一个方法,然后定制:
class Dummy(object):
def __init__(self, v):
self.ticker = v
def __str__(self):
return self._str()
def _str(self):
return super(Dummy, self).__str__()
def main():
a1 = Dummy(1)
a2 = Dummy(2)
a1._str = lambda self=a1:"a1: %d" % self.ticker
a2._str = lambda self=a2:"a2: %d" % self.ticker
print a1
print a2
a1.ticker = 100
print a1
main()
输出为:
a1: 1
a2: 2
a1: 100
请注意,这确实适用于旧式类(不扩展对象
)。请参阅我的问题以了解区别:请注意,这确实适用于旧式类(不扩展对象
)。请参阅我的问题以了解差异:@dshanahan谢谢,答案中已修复。以后请建议编辑,而不是留下评论。@dshanahan谢谢,答案中已修复。以后请建议编辑,而不是留下评论。