gpt4 book ai didi

Python方法解析之谜

转载 作者:太空狗 更新时间:2023-10-30 00:57:39 25 4
gpt4 key购买 nike

我不明白为什么这个程序会失败。

#!/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'

我使用 Boost.Python 创建了 libui,它公开了 QPoint 类。我还包含了 PyQt4,它有一个 sip-exposed QPoint。我正在尝试完成这两种类型之间的映射。

我检查过 p 是一个新式类,那么为什么 __getattr__ 没有被 p.x() 调用?

最佳答案

这有点类似于问题someone else has encountered就在昨天。简而言之,似乎特殊方法(如 __getattr____str____repr____call__ 等)似乎并不适用在新式类 instance 中不可重写,即您只能在其类型中定义它们。

这是我针对该问题的解决方案的改编版,希望对您有用:

def _q_getattr(self, attr):
print("get %s" % attr)
return getattr(self, 'x')

def override(p, methods):
oldType = type(p)
newType = type(oldType.__name__ + "_Override", (oldType,), methods)
p.__class__ = newType

override(p, { '__getattr__': _q_getattr})
print(p.__getattr__('x')()) # Works! Prints "0"
print(p.x()) # Should work!

关于Python方法解析之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5923656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com