2012-05-17 1 views
2

정적 메소드를 주입해야하는 몇 가지 클래스가 있습니다. 이 정적 메소드는 제 인수 형 (되지 인스턴스)를 호출하고, 구현 (the example at ideone)에 남아있는 모든 인수를 전달한다 :정적 인수를 * args와 함께 주입하고, 첫 번째 인수로 유형을받습니다.

# function which takes class type as the first argument 
# it will be injected as static method to classes below 
def _AnyClass_me(Class,*args,**kw): 
    print Class,str(args),str(kw) 

# a number of classes 
class Class1: pass 
class Class2: pass 

# iterate over class where should be the method injected 
# c is bound via default arg (lambda in loop) 
# all arguments to the static method should be passed to _AnyClass_me 
# via *args and **kw (which is the problem, see below) 
for c in (Class1,Class2): 
    c.me=staticmethod(lambda Class=c,*args,**kw:_AnyClass_me(Class,*args,**kw)) 

# these are OK 
Class1.me() # work on class itself 
Class2().me() # works on instance as well 

# fails to pass the first (Class) arg to _anyClass_me correctly 
# the 123 is passed as the first arg instead, and Class not at all 
Class1.me(123) 
Class2().me(123) 

출력은 (처음 두 줄 올바른 다른 두 부정확)

__main__.Class1() {} 
__main__.Class2() {} 
123() {} 
123() {} 

는 내가 거기 람다 라인에 문제가 *args 기본적 인수의 혼합물에,하지만 난 그것을 분류 할 수없는 나는 생각한다.

다른 args가있을 때 Class 객체가 올바르게 전달되게하려면 어떻게해야합니까?

답변

3

정적 방법 대신 class method을 사용해야합니다.

for c in (Class1,Class2): 
    c.me = classmethod(_AnyClass_me) 

>>> Class1.me() 
__main__.Class1() {} 
>>> Class2().me() 
__main__.Class2() {} 
>>> Class1.me(123) 
__main__.Class1 (123,) {} 
>>> Class2().me(123) 
__main__.Class2 (123,) {} 
+0

COOL! 실제 클래스에는 공통 기본 클래스가 있고 내가하려고했던 모든 것은 내가 모르는'classmethod'를 구현하는 것이 었습니다. 즉, 클래스를 호출 한 클래스를 알고있는 정적 메서드입니다. 감사! 멋진 파이어 몬드가 얼마나 많은지 확인해 주셔서 감사합니다. – eudoxos