相关疑难解决方法(0)

你可以在Python中的核心类型上修补补丁方法吗?

Ruby可以向Number类和其他核心类型添加方法以获得如下效果:

1.should_equal(1)
Run Code Online (Sandbox Code Playgroud)

但似乎Python无法做到这一点.这是真的?如果是这样,为什么?是否与类型无法修改的事实有关?

更新:我不想谈论猴子修补的不同定义,而是只关注上面的例子.我已经得出结论,由于你们中的一些人已经回答,所以无法做到.但我想更详细地解释为什么不能这样做,也许如果Python中有什么功能可以允许这样做.

回答你们中的一些人:我可能想要这样做的原因只是美学/可读性.

 item.price.should_equal(19.99)
Run Code Online (Sandbox Code Playgroud)

这更像是英语,并清楚地表明哪个是测试值,哪个是预期值,如下所示:

should_equal(item.price, 19.99)
Run Code Online (Sandbox Code Playgroud)

这个概念就是Rspec和其他一些Ruby框架所基于的.

ruby python programming-languages fluent-interface monkeypatching

49
推荐指数
6
解决办法
2万
查看次数

Python方法解析之谜

我无法弄清楚为什么这个程序失败了.

#!/usr/bin/env python
from __future__ import division, print_function
from future_builtins import *
import types
import libui as ui
from PyQt4 import QtCore
import sip

p = ui.QPoint()
q = QtCore.QPoint()

def _q_getattr(self, attr):
    print("get %s" % attr)
    value = getattr(sip.wrapinstance(self.myself(), QtCore.QPoint), attr)
    print("get2 %s returned %s" % (attr, value))
    return value

p.__getattr__ = types.MethodType(_q_getattr, p)

print(p.__getattr__('x')())  # Works!  Prints "0"
print(p.x())  # AttributeError: 'QPoint' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)

我使用Boost.Python来创建libui,它暴露了类QPoint.我包括PyQt4,它有一个sip暴露的QPoint.我正在尝试完成两种类型之间的映射.

我检查过这p是一个新式的课程,为什么不__getattr__被要求p.x()

python pyqt boost-python python-sip

5
推荐指数
1
解决办法
1148
查看次数