3

これが私の考えです:単純なオブジェクトから始めます:

class dynamicObject(object):
    pass

そして、事前に作成されたメソッドをその場で追加できるようにするには、次のようにします。

def someMethod(self):
    pass

私がこれを行うことができるように:

someObject = dyncamicObject()
someObject._someMethod = someMethod
someObject._someMethod()

問題は、次のように_someMethod()のself部分を指定する必要があることです。

someObject._someMethod(someObject)

メソッドがオブジェクトに「アタッチ」されている場合、それは自己暗示的ではないので、これはちょっと奇妙に思えますか?

私はPythonの考え方に不慣れで、C#のような言語の同じ思考プロセスから抜け出そうとしているので、ここでのアイデアは、追加する検証方法を選択して選択することにより、検証用のオブジェクトを作成できるようにすることです。ある種のオブジェクト階層を作成するのではなく、それに。私は、オブジェクトがそれに接続されたメソッドに自分自身を送信することを暗黙的に知っていると思ったので、Pythonの「自己」のアイデアが私の好意で機能するだろうと考えました。

注意すべき点の1つは、メソッドがオブジェクトにアタッチされていない(完全に異なるファイル)ので、それが問題である可能性がありますか?たぶん、それ自体でメソッドを定義することによって、自己は実際には問題のメソッドであり、したがってオブジェクトとして暗示することはできませんか?

4

5 に答える 5

7

以下では文字通りの質問に答えようとしましたが、 ムハンマド・アルカロウリの答えは、問題が実際にどのように解決されるべきかをよりよく扱っていると思います。


dynamicObjectオブジェクトではなく、クラスにメソッドを追加しsomeObjectます。

class dynamicObject(object):
    pass

def someMethod(self):
    print('Hi there!')

someObject=dynamicObject()
dynamicObject.someMethod=someMethod
someObject.someMethod()
# Hi there!

と言うとsomeObject.someMethod=someMethodsomeObject.__dict__キーと値のペアを取得します('someMethod',someMethod)

あなたが言うときdynamicObject.someMethod=someMethod、それから'ssomeMethodに追加されます。メソッド呼び出しのように動作するには、クラスで定義 する必要があります。これについての詳細は、記述子に関するRaymond Hettingerのエッセイを参照してください。結局のところ、メソッドは記述子にすぎません。--およびShalabhChaturvediの属性ルックアップに関するエッセイdynamicObject__dict__someMethodsomeObject.someMethod


別の方法があります:

import types
someObject.someMethod=types.MethodType(someMethod,someObject,type(someObject))

しかし、これは本当に忌まわしいことです。なぜなら、メソッドの適切な場所ではないの'someMethod'キーとして定義しているからです。someObject.__dict__実際、クラスメソッドはまったく取得せず、カリー化された関数のみを取得します。これは単なる技術以上のものです。dynamicObjectのサブクラスは、someMethod関数の継承に失敗します。

于 2010-09-22T16:37:29.430 に答える
6

目的を達成するために(追加する検証メソッドを選択して選択することにより、検証用のオブジェクトを作成します)、より良い方法は次のとおりです。

class DynamicObject(object):
    def __init__(self, verify_method = None):
        self.verifier = verify_method
    def verify(self):
        self.verifier(self)

def verify1(self):
    print "verify1"

def verify2(self):
    print "verify2"

obj1 = DynamicObject()
obj1.verifier = verify1

obj2 = DynamicObject(verify2)
#equivalent to
#obj2 = DynamicObject()
#obj2.verify = verify2

obj1.verify()
obj2.verify()
于 2010-09-22T16:57:09.707 に答える
0

setattrを使ってみませんか?私はこの方法がはるかに明確であることに気づきました。

class dynamicObject(object):
    pass

def method():
    print "Hi"

someObject = dynamicObject()
setattr(someObject,"method", method)
someObject.method()
于 2010-09-22T16:56:46.280 に答える
0

メソッドが非常に単純な場合、通常の関数を記述して後で追加する必要があるのは面倒な場合があります。その場合、ラムダが救いの手を差し伸べることができます。

    class Square:
        pass

    Square.getX = lambda self: self.x
    Square.getY = lambda self: self.y
    Square.calculateArea = lambda self: self.getX() * self.getY()

お役に立てれば。

于 2010-09-22T17:40:27.593 に答える
0

別のクラスをラップするだけで、インスタンスへの新しいメソッドの割り当てを処理する必要がない場合は、問題のメソッドをクラスのstaticmethodにすることができます。

class wrapperClass(object):
    @staticmethod
    def foo():
        print("yay!")

obj = wrapperClass()
obj.foo()  // Yay!

そして、他のクラスに.foo多重継承のメソッドを与えることができます。

class fooDict(dict, wrapperClass):
    """Normal dict with foo method"""

foo_dict = fooDict()
foo_dict.setdefault('A', 10)
print(foo_dict)   // {'A': 10}
foo_dict.foo()    // Yay!
于 2017-01-26T16:00:20.820 に答える