0

我必须编写一个测试模块并具有 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)到处打字

另外,我怎样才能使我可以访问传递对象和属性名称的函数中的那些属性?

4

3 回答 3

5

getattr 不是一种方法,您需要像这样调用它

getattr(obj, prop)

同样 setattr 是这样调用的

setattr(obj, prop, value)
于 2012-05-14T11:02:33.540 回答
2

一般来说,我如何确保函数影响传递的对象并且不创建副本?

Python 不是 C++,除非你明确地这样做,否则你永远不会创建副本。

我无法调整成员方法的大小,因为 myobj 实现遥不可及,而且我不想每次都键入 myobj=resize(myobj,10)

我不明白?为什么要遥不可及?如果你有实例,你可以调用它的方法。

于 2012-05-14T11:04:42.823 回答
2

一般来说,如何确保函数影响传递的对象

通过在影响传入对象的函数内部编写代码,而不是重新分配给 name

并且不创建副本?

除非您要求,否则永远不会创建副本。

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的任何对象的属性myobj(毕竟,它甚至无法提前知道它正在处理什么样的对象;变量在 Python 中没有类型,而是对象做),并尝试调用它(如果(a)对象没有那个属性;(b)这个属性实际上不是一个方法或其他类型的函数,则抛出适当的异常)。

另外,我怎样才能使我可以访问传递对象和属性名称的函数中的那些属性?/getattr也不起作用

如果你正确使用它,它肯定会起作用。它不是一种方法;它是一个内置的顶级函数。与setattr.

于 2012-05-14T11:20:58.053 回答