Если мы явно не определяем конструктор для класса, то java создает конструктор по умолчанию для класса. Это по существу непараметрированный конструктор, то есть он не принимает никаких аргументов.
Задача конструктора по умолчанию состоит в вызове конструктора суперкласса и инициализации всех переменных экземпляра. Если конструктор суперкласса отсутствует, он автоматически инициализирует переменные экземпляра равными нулю. Таким образом, это служит для использования конструктора, который должен инициализировать внутреннее состояние объекта, чтобы код, создающий экземпляр, имел полностью инициализированный, полезный объект.
Как только мы определим наш собственный конструктор для класса, конструктор по умолчанию больше не используется. Таким образом, ни один из них не является конструктором по умолчанию.
На основе кода 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
Функциональные 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
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, должна быть решена проблема закрытия.
Простите за плохой английский.
Недавно мне нужно было сгенерировать динамическую функцию, чтобы привязать каждый пункт меню к открытию определенного фрейма на 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