2016-04-07 8 views
1

ディスクリプタを取得するときに追加の引数を渡すことはできますか?例えばpython記述子の__get__を追加の引数で呼び出しますか?

、私が持っているしたいと思います。その後、

class Element(object): 
    def __init__(self, text='initial'): 
     self.text = text 

    def __get__(self, instance, owner, extra_text=''): 
     print self.text + instance.name + extra_text 

など、それを使用することができる。そして、

class MyClass(object): 
    elem1 = Element() 
    elem2 = Element(text='override') 

    def __init__(self, name): 
     self.name = name 

    def print_elems(self): 
     self.elem1 
     self.elem1(extra_text='extra') 
     self.elem2 
     self.elem2(extra_text='extra') 

MyClass('name').print_elems() 

とget:

initialname 
initialnameextra 
overridename 
overridenameextra 

がありますこの作品を作る方法は?私もelem1.__get__(self, self.__class__, extra_text='extra)を呼び出して、extra_textを必須のパラメータにしてみましたが、実際にそれを提供する方法は分かりませんでしたか?

記述子がない場合は、この構文を達成する別の方法がありますか?

ありがとうございます!

+3

'self.elem1()'と 'self.elem1(extra_text = 'extra')'に少し変更すると、基本的にメソッドが再作成されました。 AFAIKそれは可能かもしれないが、私は決してそれをしないだろう。 – Bakuriu

+1

ディスクリプタは属性( 'selfelem1'のように、単に' elem1'ではない)としてアクセスされたときにしか機能しないので、あなたは絶対にこのようにすることはできません。あなたができることは、記述子の '__get__'があなたが望む引数を受け入れる呼び出し可能なオブジェクトを返すようにすることです。しかし、あなたは普通の方法ではできないことを何をしようとしていますか? – BrenBarn

+0

@BrenBarn私の間違い、私は '自己 'を持っていた!私がしようとしていた主なことは、paramで渡すことなく、記述子クラスのインスタンスを取得することでした。 – lsglick

答えて

0

()に自動引数以外で取得するには、記述子のインスタンスにアクセスする必要があります。これを行うには... ステップ1:への最初の行として追加)(を得る:

if instance is None: 
    return self 

をこれは方法にかなり一般的な付加です。

ステップ2:

MyClass.elem1 
MyClass.elem1 

または

type(my_inst).elem1 
type(my_inst).elem1 

ステップ3:ディスクリプタをアクセスする場合は、代わりにインスタンスのクラスからそれを得る呼び出し取得()を明示的に渡します希望の引数。

醜いと冗長な;できるだけ避けてください。

私は、ディスクリプタに関する書籍を公開しています。http://www.lulu.com/spotlight/jacobz_20 あなたが混乱している場合は、本当にこの周りにあなたの頭を包んで助けることができます。

関連する問題