python, динамически реализовать класс на thefly - PullRequest
4 голосов
/ 08 декабря 2010

Предполагая, что у меня есть класс, который реализует несколько методов.Мы хотим, чтобы пользователь выбрал, какие методы запускать среди существующих методов, или он может решить добавить любой метод on_the_fly.

из примера

class RemoveNoise():
       pass

, затем методы добавляются как требуется

RemoveNoise.raw = Raw()
RemoveNoise.bais = Bias()
etc

он может даже написать новый

def new():
   pass

, а также добавить метод new()

RemoveNoise.new=new
run(RemoveNoise)

run() - это функция, которая оценивает такойclass.

Я хочу сохранить class_with_the_methods_used и связать этот класс с созданным объектом.

Любые советы о том, как решить эту проблему в python?

Ответы [ 3 ]

6 голосов
/ 08 декабря 2010

Функции могут быть добавлены в класс во время выполнения.

class Foo(object):
  pass

def bar(self):
  print 42

Foo.bar = bar
Foo().bar()
2 голосов
/ 08 декабря 2010

Нет необходимости в решении, вы просто делаете это. Вот ваш код с небольшими необходимыми изменениями:

class RemoveNoise():
       pass

RemoveNoise.raw = Raw
RemoveNoise.bias = Bias

def new(self):
   pass

RemoveNoise.new=new

instance = RemoveNoise()

Это так просто. Питон замечательный.

Почему, черт возьми, тебе это нужно, но я не такой.

0 голосов
/ 08 декабря 2010

Хорошо, вот некоторый код, который делает то, о чем я думаю, что вы просите - хотя я не совсем уверен, что вы имели в виду под " save ", когда вы писали "Я хочу сохранить class_with_the_methods_used" ». Также обратите внимание, что использование оператора exec для пользовательского ввода может быть чрезвычайно опасным, если оно поступает из ненадежного источника.

import copy

# an empty "template" class
class Generic():
    pass

# predefined functions that create common methods
def Raw():
    def raw(self):
        print 'in Raw method of instance', id(self)
    return raw

def Bias():
    def bias(self):
        print 'in Bias method of instance', id(self)
    return bias

def user_new_function(definition):
    tempdict = {}
    exec definition in tempdict
    return tempdict['new']

# create a new class
RemoveNoise = copy.deepcopy(Generic)
RemoveNoise.__name__ = 'RemoveNoise' # change the class name of the copy

# add a couple of predefined methods
RemoveNoise.raw = Raw()
RemoveNoise.bias = Bias()

# add user defined 'new' method
user_new_def = """\
def new(self):
    print 'in user defined method "new" of instance', id(self)
"""
RemoveNoise.new = user_new_function(user_new_def)

# create and use an instance of dynamically defined class
instance = RemoveNoise()
print 'RemoveNoise instance "{}" created'.format(id(instance))
# RemoveNoise instance "11974736" created
instance.raw()
# in Raw method of instance 11974736
instance.bias()
# in Bias method of instance 11974736
instance.new()
# in user defined method "new" of instance 11974736
...