当前位置: 首页 > 面试题库 >

动态地将方法附加到使用swig生成的现有Python对象上?

蓝苗宣
2023-03-14
问题内容

我正在使用Python类,但没有对其声明的写权限。如何 __str__ 在不修改类声明的情况下将自定义方法(例如)附加到从该类创建的对象?

编辑:谢谢您的所有答复。我尝试了所有方法,但它们仍未解决我的问题。这是一个最小的示例,我希望可以澄清这个问题。我正在使用swig包装C
++类,目的是重写swig模块返回 的对象*__str__功能。我使用cmake构建示例: *

test.py

import example

ex = example.generate_example(2)

def prnt(self):
    return str(self.x)

#How can I replace the __str__ function of object ex with prnt?
print ex
print prnt(ex)

example.hpp

struct example
{
    int x;
};

example generate_example(int x);

example.cpp

#include "example.hpp"
#include <iostream>

example generate_example(int x)
{
    example ex;
    ex.x = x;
    return ex;
}

int main()
{
    example ex = generate_example(2);
    std::cout << ex.x << "\n";
    return 1;
}

例子

%module example

%{
#include "example.hpp"
%}

%include "example.hpp"

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})

find_package(PythonLibs)
include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

set_source_files_properties(example.i PROPERTIES CPLUSPLUS ON)
swig_add_module(example python example.i example)
swig_link_libraries(example ${PYTHON_LIBRARIES})

if(APPLE)
    set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS "${CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS} -flat_namespace")
endif(APPLE)

要构建并运行test.py,请复制目录中的所有文件,然后在该目录中运行

cmake .
make 
python test.py

结果为以下输出:

<example.example; proxy of <Swig Object of type 'example *' at 0x10021cc40> >
2

如您所见,swig对象具有自己的 str 函数,这就是我要覆盖的对象。


问题答案:

如果创建包装器类,则它将与其他任何内置类一起使用。这称为“包含和委派”,它是继承的一种常见替代方法:

class SuperDuperWrapper(object):
    def __init__(self, origobj):
        self.myobj = origobj
    def __str__(self):
        return "SUPER DUPER " + str(self.myobj)
    def __getattr__(self,attr):
        return getattr(self.myobj, attr)

__getattr__方法会将SuperDuperWrapper对象上的所有未定义属性请求委托给包含的myobj对象。实际上,考虑到Python的动态类型,您可以使用此类来SuperDuper’ly包装几乎所有内容:

s = "hey ho!"
sds = SuperDuperWrapper(s)
print sds

i = 100
sdi = SuperDuperWrapper(i)
print sdi

印刷品:

SUPER DUPER hey ho!
SUPER DUPER 100

在您的情况下,您将从无法修改的函数中获取返回的对象,并将其包装在您自己的SuperDuperWrapper中,但是您仍然可以以其他方式访问它,就像它是基础对象一样。

print sds.split()
['hey', 'ho!']


 类似资料:
  • 假设我有一个lombok注释类 我知道我能做到: 类似于: 我在龙目岛的文件里找不到这个。

  • 本文向大家介绍js 动态生成json对象、时时更新json对象的方法,包括了js 动态生成json对象、时时更新json对象的方法的使用技巧和注意事项,需要的朋友参考一下 函数不需要 return,因为 json 对象会被函数直接修改。 下面为测试 函数应该有三个参数的,第一个为 json 对象,但应你要求,只写了两个,所以函数只能用于修改 str1。 以上这篇js 动态生成json对象、时时更新

  • 问题内容: 如何“动态”向对象添加新方法? 问题答案: 您可以利用这一点:

  • 我正在尝试将客户及其保存的CC数据从一个电子商务平台迁移到另一个(SquareSpace到WooCommerce)。这两个平台都使用Stripe作为支付网关。电子商务网站销售订阅产品,我们希望能够移动我们的客户数据,而无需他们重新输入付款信息。 在传统平台中,当通过信用卡下订阅订单时,将在Stripe中创建客户,并创建一个Payment Method Object并附加到客户。 在新平台中,当通过

  • 问题内容: 我已经读到,可以在Python中添加一个方法到现有对象(即,不是在类定义中)。 我知道这样做并不总是好的。但我们怎么做呢? 问题答案: 在Python中,函数和绑定方法之间存在差异。 绑定方法已“绑定”(描述性)到一个实例,并且无论何时调用该方法,该实例都将作为第一个参数传递。 但是,作为类(而不是实例)的属性的可调用对象仍未绑定,因此你可以在需要时随时修改类定义: 先前定义的实例也会

  • 问题内容: 这是我正在使用的 json对象 我希望将此作为另一个键值对: 我尝试了concat,但是使用||给了我结果 符号,我cdnt进行迭代。我用过溢漏,但只删除了逗号。 如何将密钥对值添加到现有的json对象?我正在使用JavaScript。 问题答案: 这是最简单的方法,对我有用。