【发布时间】:2014-12-05 17:12:37
【问题描述】:
假设如下代码:
import cv2 #3rd party python module (C extension!!)
a0 = cv2.KeyPoint(x=100,y=200,_size=20, _angle=1, _response=2, _octave=3, _class_id=4)
print "undesired output, desired syntax"
print a0
print str(a0)
print repr(a0)
print "desired output, undesired syntax"
print a0.pt, a0.size, a0.angle, a0.response, a0.octave, a0.class_id
打印出来的:
undesired output, desired syntax
<KeyPoint 0x7fc2575a9a20>
<KeyPoint 0x7fc2575a9a20>
<KeyPoint 0x7fc2575a9a20>
desired output, undesired syntax
(100.0, 200.0) 20.0 1.0 2.0 3 4
如何使用所需的语法获得所需的输出?
据我所知有以下几种方法:
从 KeyPoint 派生我自己的类并在那里实现 str 和 repr:不需要为 a) cv2 中的某些函数需要一个 cv.KeyPoint 对象列表,并且转换会减慢代码速度 b) 额外的类层使代码更复杂
猴子补丁关键点: 会很好但不起作用(见下面的代码)。另外我不知道 cv2 中期望 KeyPoint 列表的函数是否会接受这样的修改类。
猴子补丁 a0: 会不太好,但也不起作用(见下面的代码)。
为类型为 cv2.KeyPoint 的对象注册一个全局格式化函数,只要此类对象必须转换为字符串,就会调用该函数。 (类似于用于泡菜序列化的 copyreg 的方法)。我没有发现任何暗示确实存在这样的注册表。
我的猴子补丁意图:
def custom_str(self):
return " ".join(self.pt, self.size, self.angle, self.response, self.octave, self.class_id)
try:
print "patching class"
cv2.KeyPoint.__str__ = custom_str
print str(a0)
a1 = cv2.KeyPoint(x=100,y=200,_size=20, _angle=1, _response=2, _octave=3, _class_id=4)
print str(a1)
except Exception, e:
print "failed"
print e
try:
print "patching object"
a0.__str__ = custom_str
print str(a0)
except Exception, e:
print "failed"
print e
输出:
patching class
failed
'builtin_function_or_method' object attribute '__str__' is read-only
patching object
failed
'cv2.KeyPoint' object attribute '__str__' is read-only
【问题讨论】:
-
您应该尝试搜索“猴子补丁属性”(但是,我不确定它是否可能),因为“只读”异常很可能意味着该属性(
__str__方法在你的情况下)是财产。 -
stackoverflow.com/questions/972/… 没有回答您的问题,但可能会提供一些指示
标签: python module external monkeypatching