2017-03-20 2 views
1

メソッドを持ち、関数またはプロパティとして呼び出すことは可能ですか?メソッドをプロパティまたは関数として呼び出しますか?

def Foo: 
    def bar(self,x=1,y=2): 
    return x+y 

foo=Foo() 
foo.bar #should return 3 
foo.bar(4,5) #should return 9 

ので、不可能であると思わ:foo.barは__getattribute__を呼び出します

  • 。それはdescriptiorだ場合、__get__は)バーは()それも、発信者
  • に返される前に、属性が関数であれば、それは機能のみを返し、その後(評価されていることを意味し、__getattribute__内から呼び出されます適用されます
  • その関数への呼び出し側が故に特性または機能
  • を呼び出している場合はそのため、それは__getattribute__に検出することは不可能だ、デュアル動作が可能ではない

私は何を実装するために飛び乗っする(擬似コードのようなものです):

def __getattribute__(): 
    if len(args)>1: return function 
    else: return property 

しかし、引数が__getattribute__または__get__に渡されていないので、どこでどのようにプロパティと機能を切り替えるには、私は知りません。

+0

問題は 'F​​oo'あなたは属性でやろうとしているのか分からないことを確かです:を呼び出す部分がない限り、' Foo' ... –

+0

に伝達されていません。..プロパティによって返された結果が.__ call__メソッドを持っていて呼び出し元が結果を保持したり関数を呼び出すことができれば...それは悪くて醜いと疑わしい...しかし...おそらく – dkone

+0

あなたはある程度まですることができます - デフォルトの結果を計算し、 '__call__'を結果に結びつけるプロキシ要素を生成します。問題は、この関数に副作用があると、これらが "起動"されるということです... –

答えて

1

だけ使用します。

foo.bar() # 3 
foo.bar(4, 5) # 9 

あなたはここで、主張しない場合は、WILが、実際のpython 3.6の3と9作品を返す、非常に醜い、使用不可能なソリューションです。それを使用しないでください:

class CallableInt(int): 
    """But, why????""" 
    def __call__(self, x, y): 
     return x + y 


class Foo: 
    @property 
    def bar(self): 
     return CallableInt(3) 


foo = Foo() 
print(foo.bar) 
print(foo.bar(4, 5)) 
+0

実際には、これはうまくいくでしょう、2つの問題(同じコインの2つの側面):1)プロパティは常に評価されます2)プロパティも自己を関数として呼び出すなら、これはまったく機能しません(しかし、何故それから何らかの意味をなす理由;-)) – dkone

関連する問題