2017-03-20 1 views
1

그것은 방법이 있고 어느 기능 또는 특성으로 호출 할 수 있습니까?메서드 또는 속성을 메서드로 호출합니까?

  • foo.bar이 __getattribute__를 호출합니다; 때문에

    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 
    

    불가능한 것 같다 그것은 descriptior 인 경우에, __get__는 심지어 발신자 속성은 함수가있는 경우

  • 에 반환되기 전에 막대()가 평가되는 것을 의미 __getattribute__ 내에서 호출됩니다 만 적용되는 기능과 다음 ()를 반환 발신자가 속성 또는 따라서 기능
  • 를 호출하면 그 기능 때문에 그
  • 에, 그것은 __getattribute__에 탐지하는 것은 불가능하다, 듀얼 행동은 내가 (의사 코드 같은 것입니다 구현하기 위해 미쳐 무엇

수 없습니다) :

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

그러나 인수가 __getattribute__ 또는 __get__에 전달되지 않기 때문에, 나는 어디서 어떻게 재산과 기능 사이를 전환하는 방법을 모르겠어요.

+0

문제는 Foo' 당신이 속성 무슨 말을하는 건가요 모르는 '것이 참으로 ... 호출 부분이 Foo''에 전달되지 –

+0

하지 않는 한 .. . 속성에 의해 반환되는 결과가 .__ call__ 방법이 있고, 호출 측이 결과를 유지하거나 함수를 호출하도록 선택할 수 있다면 ... 그것은 어쩌면 – dkone

+0

아니라 당신이 할 수있는 ... 나쁜 추한 의심 ...하지만 - 어느 정도 - 기본 결과를 계산하고 결과에 '__call__'을 첨부하는 프록시 요소를 생성합니다. 함수가 부작용이있는 경우 세터 전혀 __getattribute__ 호출하지 않기 때문에 문제는, 이러한, –

답변

1

그냥 사용 : 당신이 주장하는 경우

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

가 여기에 매우 추한, 사용할 수 없게 솔루션입니다, 그 줘야 실제로 파이썬 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

사실, 이것은 단지 두 가지 문제 (동전의 양면을) 일 것 어떤 의미에서 벗어나야하는지 ;-)) – dkone

관련 문제