2013-04-14 2 views
2

내 질문은 바인딩 된 메서드 개체와 관련이 있습니다. 특히 함수 (본질적으로 설명자)와 동일한 동작을 모방하려고합니다. 설명자를 사용하여 바인딩 된 메서드 구현

나를 먼저 여기 class_instance.function은() type(dfunc)이 x는 클래스 인스턴스의 경우는 기능과 type(d).__dict__['dfunc'].__get__(d, type(d)) 인 경우

Class D(object): 
    def dfunc(self): 
     ... 

d=D() 
d.dfunc() # will call D.__dict__['dfunc'].__get__(d,D)() 

#gives a bound method which can be used directly 
a=D.__dict__['dfunc'].__get__(d,D) 
a() #works as d.D() 

합니까 파이썬 전화 D.__dict__['dfunc'] (d)을, 어떻게 작동하는지에 대한 이해를 넣어 보자?

지금은 사용 폐쇄 바운드 개체를 만들려고하고 있어요 방법에 오는 : 이제

class E(object): 
    def __get__(self,obj,cls): 

     def returned(*args): 
      print(obj.__dict__) 
     return returned 

class F(object): 
    e=E() 
    y=9 

f=F() 
f.fvar=9 #putting something in instances __dict__ 
a=f.e #will call the __get__ function of F and return a closure 
a() #works and produces instance specific result -> {'fvar': 9}, just like a bound method 

내가 a=D.__dict__['dfunc'].__get__(d,D) 유형 (A)가 결합 된 방법을했던 주요 질문 ,하지만 난 그것을 type(a)를 구현할 때 기능입니다; 거기에 바인딩 된 개체를 사용자 정의 설명자에서 반환하는 방법은 무엇입니까?

설명자와 같은 기능을 구현하는 더 좋은 방법이 있습니까? 내 머리 속에서 근본적으로 잘못된 것이 있다면 나에게 맞게 수정하십시오. 대신 방법을 반환하려면

답변

1

, 당신은 __get__에 전달되는 인수와 함께 함수 객체에서 하나를 만들 수 있습니다

import types 

class E(object): 
    def __get__(self,obj,cls): 

     def returned(*args): 
      print(obj.__dict__) 
     return types.MethodType(returned, obj, cls) 

그러나,이 당신을 얻는 것을 완전히 명확하지 않다. 함수를 반환하는 것이 이미 작동하는 경우 왜 "실제"방법이 필요합니까?

+0

변경 내용을 사용하여 fe (f는 속성으로 e를 갖는 F 클래스의 인스턴스이고 e는 E의 인스턴스 임), 오류 TypeError : 메소드가 2 개의 예상 인수를 가지며 3을가집니다. –

+0

저에게 효과적입니다. . – BrenBarn

+0

나는 Python3.3을 사용하고있다. 이유가 될 수있다. –

관련 문제