2013-06-13 3 views
0

동적 속성을 추가하는 일반 클래스가 있고 인스턴스에 동적으로 메서드를 추가 할 수 있습니다. 특정 인스턴스에는 다른 메서드가 있지만 이러한 메서드에 액세스해야합니다. 동적 속성.동적으로 추가 된 함수에 동적으로 추가 된 속성에 액세스하는 방법

어떻게하면됩니까?

class GenericComponent: 
    def __init__(self, ID): 
     self.ID = ID 

    @classmethod 
    def addMethod(cls, func): 
     return setattr(cls, func.__name__, types.MethodType(func, cls)) 
내 논리에서

, 내가 다른 인스턴스에 대해 내가 같은 방법으로 이름이 있도록 내가 이런 걸 가지고 이러한 일반적인 구성 요소를 구축으로하지만, 내부의 논리는 다르다. 내가 obj.toString()를 호출 할 때

  if t==0: 
       def toString(target): 
        print "toString: ", target 
        attrs = vars(target) 
        print ', '.join("%s: %s" % item for item in attrs.items())    
       obj = GenericComponent(ID) 
       obj.ID = ID 
       obj.name = "some random name" 
       obj.addMethod(toString) 
       obj.toString() 

는 불행히도 당신은 addMethod 클래스 메소드했습니다 obj.name

답변

1

볼 수 없습니다. 파이썬 클래스 메소드는 obj.addMethod(toString)으로 여기에서와 같이 인스턴스에서 호출 될 수 있지만이 경우 인스턴스는 해당 클래스를 가져 오는 데만 사용됩니다. addMethod에 전달 된 첫 번째 인수는 obj의 클래스입니다.

addMethod 호는 클래스의 결합 방법 (예, toString)에서 두 번째 인수로 전달하는 기능을한다. obj.toString() 명령은 먼저 toString 속성을 obj으로 검색합니다. 해당 조회 프로세스는 호출 가능 클래스의 속성을 찾습니다. 그러나 당신이 호출하는 것은 인스턴스의 바운드 메소드가 아니라 클래스의 바운드 메소드입니다. 이 메서드는 클래스를 사용하여 target 값으로 호출되므로 인스턴스의 클래스 특성이 아니라 클래스의 특성을 인쇄합니다.

나는 당신이 달성하려는 정확히 잘 모르겠지만, 아마도 이것은 당신이 원하는에 가까운 :

class GenericComponent: 
    def __init__(self, ID): 
     self.ID = ID 
    def addMethod(self, func): 
     return setattr(self, func.__name__, types.MethodType(func, self)) 

def toString(target): 
    print "toString: ", target 
    attrs = vars(target) 
    print ', '.join("%s: %s" % item for item in attrs.items()) 
ID = 'some ID' 
obj = GenericComponent(ID) 
obj.name = "some random name" 
obj.addMethod(toString) 
obj.toString() 
+0

아침에 그것을 시도 할 것이다. 고맙습니다. 동료는 obj.name 대신 obj.getattr ("name")을 사용하는 것이 좋을 수 있다고 제안했습니다. 기본적으로 저는 우리가 어떻게 문제를 해결할 지 모르는 프로젝트를 진행하고 있습니다. 그리고 내가 정의 된 클래스를 동적으로 사용하지 않고 특정 디자인에 고정시킬 수도 있습니다. 매우 역동적이어서 어떤 디자인에도 빠지지 않습니다. –