在Python中,我想直接从Parent类的实例构造一个Child类的实例.例如:
A = Parent(x, y, z)
B = Child(A)
Run Code Online (Sandbox Code Playgroud)
这是我认为可行的黑客行为:
class Parent(object):
def __init__(self, x, y, z):
print "INITILIZING PARENT"
self.x = x
self.y = y
self.z = z
class Child(Parent):
def __new__(cls, *args, **kwds):
print "NEW'ING CHILD"
if len(args) == 1 and str(type(args[0])) == "<class '__main__.Parent'>":
new_args = []
new_args.extend([args[0].x, args[0].y, args[0].z])
print "HIJACKING"
return Child(*new_args)
print "RETURNING FROM NEW IN CHILD"
return object.__new__(cls, *args, **kwds)
Run Code Online (Sandbox Code Playgroud)
但是当我跑步的时候
B = Child(A)
Run Code Online (Sandbox Code Playgroud)
我明白了:
NEW'ING CHILD
HIJACKING
NEW'ING CHILD
RETURNING FROM NEW …Run Code Online (Sandbox Code Playgroud) 我正在使用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)
Run Code Online (Sandbox Code Playgroud)
example.hpp
struct example
{
int x;
};
example generate_example(int x);
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
example.i
%module example
%{ …Run Code Online (Sandbox Code Playgroud)