0

ちょっと変わったことをしたい。非関数または関数としてアクセスできるクラス属性にアクセスできるようにしたい:

class foo(object):
    def __init__(self):
        self.x = 99
    def x(self, *args, **kwargs ):
        print "x was called, args=%r, kwargs=%r" % (args, kwargs)
        return( self.x )  # return something useful here...

f = foo()
    print f.x  # prints "x was called", 99
    print f.x() # prints "x was called", 99
4

1 に答える 1

3

なぜそれをしたいのかわかりませんが、propertyデコレータを使用する1つの方法があります:

class Foo(object):
    @property
    def x(self):
        print "x was called"
        return lambda: None

しかし、これはまったくナンセンスです。あなたの例がやろうとしていることを達成しますがFoo().x、ラムダ関数にアクセスすると、それ以外の場合は役に立たないものが返されます。

カスタム クラスのインスタンスを返すことに問題がない場合は、そのカスタム クラスに、__call__()単純に返されるメソッドを指定して、もう少し意味selfを持たせることもできます。.x()

class XReturnValue(object):
    def __call__(self):
        return self

class Foo(object):
    @property
    def x(self):
        print "x was called"
        return XReturnValue()

XReturnValueのユーザーにとって実際に何かを意味するように、さらに肉付けすることができますFoo.x

ただし、Python の呼び出し可能オブジェクト (関数やメソッドなど) は、それ自体がオブジェクトです。それらを操作したり、それらに属性を追加したり、後で使用するために別の変数に割り当てたりすることができます。結果を取得するには、それらを呼び出しますが、それらを呼び出さない場合は、その参照を取得して他の場所で再利用できます。それを回避しようとしてはいけません。

.xつまり、属性、 、またはメソッドであることに固執しますpropertyが、すべてを一度にしようとしないでください。

于 2012-11-30T16:41:40.663 に答える