我必须编写一个测试模块并使用c ++ - Background。也就是说,我知道python中没有指针,但我如何实现以下目标:
我有一个测试方法,它看起来像这样的伪代码:
def check(self,obj,prop,value):
if obj.prop <> value: #this does not work,
#getattr does not work either, (objects has no such method (interpreter output)
#I am working with objects from InCyte's python interface
#the supplied findProp method does not do either (i get
#None for objects I can access on the shell with obj.prop
#and yes I supply the method with a string 'prop'
if self._autoadjust:
print("Adjusting prop from x to y")
obj.prop = value #setattr does not work, see above
else:
print("Warning Value != expected value for obj")
由于我想在不同的函数中检查许多不同的对象,我希望能够保持检查方法。
通常,我如何确保函数影响传递的对象而不创建副本?
myobj.size=5
resize(myobj,10)
print myobj.size #jython =python2.5 => print is not a function
我无法调整成员方法的大小,因为myobj
实现无法实现,我不想在任何地方输入myobj=resize(myobj, 10)
另外,我怎样才能使它能够在我传递对象和属性名称的函数中访问这些属性?
答案 0 :(得分:4)
getattr不是一种方法,你需要像这样调用它
getattr(obj, prop)
类似地,setattr就像这样调用
setattr(obj, prop, value)
答案 1 :(得分:2)
一般情况下,我如何确保函数影响传递的对象而不创建副本?
Python不是C ++,除非您明确这样做,否则永远不会创建副本。
我无法调整成员方法的大小,因为myobj实现是遥不可及的,我不想每次都输入myobj = resize(myobj,10)
我不明白吗?为什么要遥不可及?如果你有实例,你可以调用它的方法。
答案 2 :(得分:2)
通常,我如何确保函数影响传递的对象
通过在影响传入对象的函数中编写代码,而不是重新分配名称。
并不创建副本?
除非您要求,否则永远不会创建副本。
Python“变量”是事物的名称。它们不存储物体;他们指的是对象。但是,与C ++引用不同,它们可以引用其他内容。
写作时
def change(parameter):
parameter = 42
x = 23
change(x)
# x is still 23
x仍为23的原因是不因为复制了,因为副本不是。原因是,在函数内部,parameter
作为传入的整数对象23
的名称开始,然后行parameter = 42
导致parameter
停止存在23
的名称,并开始成为42
的名称。
如果你这样做
def change(parameter):
parameter.append(42)
x = [23]
change(x)
# now x is [23, 42]
传入的参数会更改,因为列表上的.append
会更改实际的列表对象。
由于
resize
实施无法实现,我无法将myobj
作为成员方法
无所谓。当Python编译时,没有类型检查步骤,并且没有步骤来查找插入调用的方法的实现。所有这些都是在代码实际运行时处理的。代码将到达myobj.resize()
点,查找当前引用的任何对象resize
的{{1}}属性(毕竟,它甚至无法提前知道什么样的对象它正在处理;变量在Python中没有类型,而是对象有),并试图调用它(如果(a)对象结果没有该属性,则抛出适当的异常;(b)该属性结果不是实际上是一种方法或其他类型的功能)。
另外,我怎样才能使它能够在我传递对象和属性名称的函数中访问这些属性? /
myobj
不起作用
如果你正确使用它肯定会有效。这不是一种方法;它是一个内置的顶级功能。与getattr
相同。