2012-04-29 5 views
10

함수 구현을 동적으로 할당하려고합니다.Python에서 동적으로 함수 구현을 할당합니다.

의 다음 시작하자 : 다른 언어

class Doer(object): 

    def __init__(self): 
     self.name = "Bob" 

    def doSomething(self): 
     print "%s got it done" % self.name 

def doItBetter(self): 
    print "Done better" 

우리가 익명 함수를 doItBetter하고 객체에 할당한다. 그러나 Python에서 익명 함수를 지원하지 않습니다. 나는 개체의 인스턴스로에 호출을 할당했는데, 마지막으로

Traceback (most recent call last): Line 13, in doer.doSomething() Line 9, in call print "%s got it done better" % self.name AttributeError: 'DoItBetter' object has no attribute 'name'

대신, 우리는 호출 클래스 인스턴스를 만드는 시도하고 클래스에 그를 할당 할 수 있습니다 :

class Doer(object): 

    def __init__(self): 
     self.name = "Bob" 

class DoItBetter(object): 

    def __call__(self): 
     print "%s got it done better" % self.name 

Doer.doSomething = DoItBetter() 
doer = Doer() 
doer.doSomething() 

저에게이 있습니다 내가 DoItBetter에 자신을 참조하지 않는

class Doer(object): 

    def __init__(self): 
     self.name = "Bob" 

class DoItBetter(object): 

    def __call__(self): 
     print "%s got it done better" % self.name 


doer = Doer() 
doer.doSomething = DoItBetter() 
doer.doSomething() 

이 한 일을 않지만, 내가 할 때 참조 있기 때문에 그것은 self.name에 나에게 이름 오류가 있습니다 : 속성과 호출 호출 원의 self은 소유 클래스 self이 아닙니다.

그래서 익명의 함수를 클래스 함수 나 인스턴스 메서드에 할당하려고합니다. 메서드 호출은 개체의 self을 참조 할 수 있습니다.

+0

거부 ​​한 첫 번째 접근 방식에 아무런 문제가 없습니다. 왜 그렇게 복잡한가? –

+2

오류가 정말 이상합니다 - 루비 인터프리터로 파이썬 스크립트를 실행하려고합니까? (파일 이름은'prog.rb','.py'는 파이썬 파일 확장자입니다.) 오류는 파이썬에서 분명히 아닙니다 -'self'는 파이썬에서 키워드가 아닙니다. –

+0

내 실수로 루비 설정이있는 온라인 코드 패드에서 실행했습니다. – Yarin

답변

23

첫 번째 접근 방식은 확인했다, 당신은 단지 클래스에 기능을 할당 할 수 있습니다

class Doer(object): 
    def __init__(self): 
     self.name = "Bob" 

    def doSomething(self): 
     print "%s got it done" % self.name 

def doItBetter(self): 
    print "%s got it done better" % self.name 

Doer.doSomething = doItBetter 

익명 함수는 방식으로 (이 일과 아무 상관을, 파이썬은 하나의 표현으로 구성된 간단한 익명의 기능을 지원합니다 , lambda 참조).

+0

익명으로 +1하는 것이 중요하지 않습니다. 문제는 모든 것이 중요합니다. 기능. –

+0

고마워요.이 작품은 훌륭합니다. 왜 그렇게 생각하지 않았는지 모르겠습니다. – Yarin

19

yak의 대답은 클래스의 모든 인스턴스에 대해 무언가를 변경하려는 경우에 효과적입니다.

이 아닌 전체 클래스 만 개체의 특정 예를하는 방법을 변경하려는 경우, 당신은 바인딩 방법을 만들 수 MethodType 타입의 생성자를 사용해야 할 것 :

from types import MethodType 

doer.doSomething = MethodType(doItBetter, doer, Doer) 
+0

@ Amber- 고마워요. – Yarin

+1

적어도 파이썬 3에서는'doer.doSomething = MethodType (doItBetter, doer)'이어야합니다. 메소드와 함수의 여러 사례에 대한 좋은 설명은 http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object-instance – yanlend

+0

@yanlend에서 제공됩니다. 파이썬 2. – Amber

관련 문제