2013-06-13 1 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)) 

В моей логике, так как я строй этих общих компонентов, у меня есть что-то вроде этого, так что для разных случаев, у меня будет такое же имя метода, но логика внутри него отличается.

  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() 

К сожалению, когда я звоню obj.toString() не будет видеть obj.name

ответ

1

Вы сделали addMethod метод класса. Методы класса Python могут быть вызваны в экземпляре, как вы здесь, с obj.addMethod(toString), но в этом случае экземпляр используется только для получения его класса; первый аргумент, переданный addMethod, относится к классу obj.

Ваш addMethod вызов затем делает функцию передается в качестве второго аргумента (в данном примере, toString) а связанный метод класса. Затем инструкция obj.toString() сначала ищет атрибут toStringobj; этот процесс поиска находит атрибут класса, который также можно вызывать. Но то, что вы вызываете тогда, не является связанным методом экземпляра, а связанным методом класса. Затем метод вызывается с классом как значение 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.getattr («name») вместо obj.name, и это может работать лучше. В основном я работаю над проектом, где мы не знаем, как мы будем решать проблему, и если я использую определенные классы вместо того, чтобы быть настолько динамичными, то мы можем быть заблокированы в конкретном проекте. Будучи очень динамичным, я не заперт в какой-либо конструкции. –