相关疑难解决方法(0)

为什么`type(x).__在Python标准contextlib中输入__(x)`而不是`x .__输入__()`?

contextlib.py,我看到ExitStack类正在呼叫__enter__()经由类型的对象方法(type(cm)),而不是直接方法调用给定对象(cm).

我想知道为什么或为什么不.

例如,

  • 发生错误时它会提供更好的异常跟踪吗?
  • 它只是特定于一些模块作者的编码风格?
  • 它有任何性能优势吗?
  • 它是否避免了复杂类型层次结构的一些工件/副作用?

python

9
推荐指数
1
解决办法
279
查看次数

如何修补`__call__`方法?

我似乎无法修补__call__类实例的方法(是的,我想修补单个实例,而不是所有实例).

以下代码:

class A(object):
    def test(self):
        return "TEST"

    def __call__(self):
        return "EXAMPLE"

a = A()
print("call method: {0}".format(a.__call__))
print("test method: {0}".format(a.test))
a.__call__ = lambda : "example"
a.test = lambda : "test"
print("call method: {0}".format(a.__call__))
print("test method: {0}".format(a.test))

print(a())
print("Explicit call: {0}".format(a.__call__()))
print(a.test())
Run Code Online (Sandbox Code Playgroud)

输出:

call method: <bound method A.__call__ of <__main__.A object at 0x7f3f2d60b6a0>>
test method: <bound method A.test of <__main__.A object at 0x7f3f2d60b6a0>>
call method: <function <lambda> at 0x7f3f2ef4ef28>
test method: <function <lambda> at 0x7f3f2d5f8f28>
EXAMPLE
Explicit call: …
Run Code Online (Sandbox Code Playgroud)

python monkeypatching

8
推荐指数
2
解决办法
1228
查看次数

标签 统计

python ×2

monkeypatching ×1