我正在使用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。 问题答案: 这是最简单的方法,对我有用。