如何编写将方法添加到类的函数?我有:
class A:
def method(self):
def add_member(name):
self.new_method = def name...?
add_member("f1")
add_member("f2")
为了回答我想做的事情。我正在尝试排除一些pyqt插槽。我希望能够调用一个函数
create_slider
,该函数将创建QSlider
和QLabel
并创建滑块处理代码,并使滑块处理程序更新QLabel
中的文本。这是需要排除的插槽: def on_sample_slider(self, value):
self.samples = pow(4, value)
self.sample_label.setText('%d' % self.samples)
这是一个生成UI的方法,但是每次调用它时也会生成on_sample_slider方法会很不错:
def insert_labeled_slider(hbox, name, slider_target):
# name
hbox.addWidget(QLabel(name))
# label
label = QLabel()
label.setMinimumSize(40, 0)
hbox.addWidget(self.sample_label)
#slider
slider = QSlider(Qt.Horizontal)
slider.setRange(0, 6)
slider.setTracking(True)
slider.setPageStep(1)
hbox.addWidget(slider)
self.connect(self.sample_slider, SIGNAL('valueChanged(int)'),
self.on_sample_slider)
self.sample_slider.setValue(0)
return (label, slider)
最终代码:
def attach_on_slider(obj, name, variable, label, base):
def on_slider(self, value):
variable = base**value
label.setText('%d' % variable)
# This next line creates a method from the function
# The first arg is the function and the second arg is the object
# upon which you want it to be a method.
method = types.MethodType(on_slider, obj)
obj.__dict__["on_slider_" + name] = method
return method
class A:
def insert_labeled_slider(hbox, name, label_name, variable):
# name
hbox.addWidget(QLabel(label_name))
# label
label = QLabel()
label.setMinimumSize(40, 0)
hbox.addWidget(label)
#slider
slider = QSlider(Qt.Horizontal)
slider.setRange(0, 6)
slider.setTracking(True)
slider.setPageStep(1)
hbox.addWidget(slider)
on_slider_method = attach_on_slider(self, name, variable, label, 4)
self.connect(slider, SIGNAL('valueChanged(int)'),
on_slider_method)
slider.setValue(0)
return (label, slider)
最佳答案
这是您新发布的代码中的真实示例:
import types
def attach_on_sample_slider(obj, base):
def on_sample_slider(self, value):
self.samples = base**value
self.sample_label.setText('%d' % self.samples)
# This next line creates a method from the function
# The first arg is the function and the second arg is the object
# upon which you want it to be a method.
obj.on_sample_slider = types.MethodType(on_sample_slider, obj)
您现在可以像这样称呼它
def some_method(self, foo):
attach_on_sample_slider(self, 4)
原始帖子
既然您说成员函数是相同的,那么我会这样做
def make_method(name):
def method(self, whatever, args, go, here):
#whatever code goes here
method.__name__ = name
return method
class A(object):
method1 = make_method('method1')
method2 = make_method('method2')
严格来说,不需要传入名称并在新函数上设置
__name__
属性,但这可以帮助调试。这有点重复,并且可以收回成本。如果您要跳过该步骤,则不妨这样做class A(object):
def method1(self, arg1, arg2):
#code goes here
method2 = method1
method3 = method1
这将创建相同的方法。调用它们中的任何一个将产生相同的方法。
第一种形式更强大,因为您可以将名称之外的其他参数传递到
make_method
中,并使返回方法的不同版本在闭包中访问这些参数,因此它们的工作方式不同。这是一个带有函数的愚蠢示例(与方法相同):def make_opener(filename):
def opener():
return open(filename)
return opener
open_config = make_opener('config.cfg')
open_log = make_opener('log.log')
在这里,它们本质上都是相同的功能,但做些细微的事情,因为它们可以访问创建时使用的
filename
的值。如果您要做很多这类事情,那么绝对要考虑关闭。可能还有更多内容,因此,如果您有无法解决的特定问题,则应更新您的问题。
关于python - Python元编程: automatically generate member functions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4232371/