Вот реальный пример из вашего недавно опубликованного кода:
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
, с которым они были созданы. Закрытия - это определенно то, на что стоит обратить внимание, если вы собираетесь делать много такого рода вещей.
Это может быть намного больше, поэтому, если у вас есть конкретные вопросы, на которые они не отвечают, вы должны обновить свой вопрос.