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 の実装が手の届かないところにあるため、メンバー メソッドのサイズを変更することはできません。

理解できません?なぜ手の届かないところにいる必要があるのですか?インスタンスがある場合は、そのメソッドを呼び出すことができます。

于 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 = 42parameterの名前ではなくなり、 の名前23になり始めるため42です。

もしあなたがそうするなら

def change(parameter):
    parameter.append(42)

x = [23]
change(x)
# now x is [23, 42]

.appendリストでは実際のリスト オブジェクトが変更されるため、渡されたパラメータが変更されます。

実装が行き届いていないためresize、メンバーメソッドを作成できませんmyobj

それは問題ではありません。Python のコンパイル時には、型チェックの手順はなく、呼び出しを挿入するメソッドの実装を検索する手順もありません。これらはすべて、コードが実際に実行されるときに処理されます。コードは要点に到達し、現在参照しているオブジェクトの属性をmyobj.resize()探します(結局のところ、処理しているオブジェクトの種類でさえ事前に知ることはできません。変数は Python では型を持たず、代わりにオブジェクトです) (a) オブジェクトがその属性を持たないことが判明した場合、(b) 属性が実際にはメソッドまたはその他の種類の関数ではないことが判明した場合、適切な例外をスローします)。resizemyobj

また、オブジェクトと属性名を渡す関数でこれらの属性にアクセスできるようにするにはどうすればよいですか? /getattrどちらも機能しません

正しく使えば確かに効果はあります。メソッドではありません。これは組み込みのトップレベル関数です。と同じことsetattr

于 2012-05-14T11:20:58.053 に答える