Динамическое/во время выполнения создание метода (генерация кода) в Python

Если мы явно не определяем конструктор для класса, то java создает конструктор по умолчанию для класса. Это по существу непараметрированный конструктор, то есть он не принимает никаких аргументов.

Задача конструктора по умолчанию состоит в вызове конструктора суперкласса и инициализации всех переменных экземпляра. Если конструктор суперкласса отсутствует, он автоматически инициализирует переменные экземпляра равными нулю. Таким образом, это служит для использования конструктора, который должен инициализировать внутреннее состояние объекта, чтобы код, создающий экземпляр, имел полностью инициализированный, полезный объект.

Как только мы определим наш собственный конструктор для класса, конструктор по умолчанию больше не используется. Таким образом, ни один из них не является конструктором по умолчанию.

42
задан Eli Bendersky 11 February 2009 в 03:40
поделиться

4 ответа

На основе кода Theran, но расширения его к методам на классах:



class Dynamo(object):
    pass

def add_dynamo(cls,i):
    def innerdynamo(self):
        print "in dynamo %d" % i
    innerdynamo.__doc__ = "docstring for dynamo%d" % i
    innerdynamo.__name__ = "dynamo%d" % i
    setattr(cls,innerdynamo.__name__,innerdynamo)

for i in range(2):
    add_dynamo(Dynamo, i)

d=Dynamo()
d.dynamo0()
d.dynamo1()


, Который должен распечатать:


in dynamo 0
in dynamo 1

71
ответ дан John Montgomery 23 September 2019 в 13:43
поделиться

Функциональные docstrings и имена являются изменяемыми свойствами. Можно сделать что-либо, что Вы хотите во внутренней функции или даже имеете несколько версий внутренней функции, между которой выбирает makedynamo (). Никакая потребность создать любой код из строк.

Вот отрывок из интерпретатора:

>>> def makedynamo(i):
...     def innerdynamo():
...         print "in dynamo %d" % i
...     innerdynamo.__doc__ = "docstring for dynamo%d" % i
...     innerdynamo.__name__ = "dynamo%d" % i
...     return innerdynamo

>>> dynamo10 = makedynamo(10)
>>> help(dynamo10)
Help on function dynamo10 in module __main__:

dynamo10()
    docstring for dynamo10
12
ответ дан bobince 23 September 2019 в 13:43
поделиться

Python позволит Вам объявить функцию в функции, таким образом, Вы не должны будете делать exec обман.

def __init__(self):

    def dynamo(self, arg):
        """ dynamo's a dynamic method!
        """
        self.weight += 1
        return arg * self.weight
    self.weight = 50

    setattr(self.__class__, 'dynamo', dynamo)

, Если Вы хотите иметь несколько версий функции, можно поместить все это в цикл и варьироваться, что Вы называете ими в эти setattr функция:

def __init__(self):

    for i in range(0,10):

        def dynamo(self, arg, i=i):
            """ dynamo's a dynamic method!
            """
            self.weight += i
            return arg * self.weight

        setattr(self.__class__, 'dynamo_'+i, dynamo)
        self.weight = 50

(я знаю, это не большой код, но он понимает через). До установки docstring я знаю, что это возможно, но я должен был бы искать его в документации.

Редактирование : можно установить docstring через dynamo.__doc__, таким образом, Вы могли сделать что-то вроде этого в своем теле цикла:

dynamo.__doc__ = "Adds %s to the weight" % i

Другое Редактирование : Со справкой от @eliben и @bobince, должна быть решена проблема закрытия.

8
ответ дан Justin Voss 23 September 2019 в 13:43
поделиться

Простите за плохой английский.

Недавно мне нужно было сгенерировать динамическую функцию, чтобы привязать каждый пункт меню к открытию определенного фрейма на wxPython. Вот что я делаю.

сначала я создаю список соответствия между пунктом меню и фреймом.

menus = [(self.menuItemFile, FileFrame), (self.menuItemEdit, EditFrame)]

первый элемент в отображении - это пункт меню, а последний элемент - это кадр, который нужно открыть. Затем я привязываю событие wx.EVT_MENU из каждого пункта меню к определенному кадру.

for menu in menus:
    f = genfunc(self, menu[1])
    self.Bind(wx.EVT_MENU, f, menu[0])

Функция genfunc - это конструктор динамических функций, вот код:

def genfunc(parent, form):
    def OnClick(event):
        f = form(parent)
        f.Maximize()
        f.Show()
    return OnClick
-1
ответ дан 26 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: