Я хочу создать подкласс класса существующего пакета (исходный код которого я не хочу / не могу изменить). Объекты класса инициализируются только с использованием строки, а затем заполняются с использованием всех видов функций add
. Минимальный пример может выглядеть так (без каких-либо add
функций):
import copy
class Origin(object):
def __init__(self, name):
self.name = name
self.dummy_list = [1, 2, 'a']
self.dummy_stuff = {'a': [12, 'yt']}
def make_copy(self):
return copy.deepcopy(self)
def dummy_function(self):
return len(self.dummy_list)
Я хочу создать подкласс таким образом, чтобы я мог инициализировать его экземпляры, используя экземпляр Origin
. Прямой путь будет
class BasedOnOrigin(Origin):
def __init__(self, origin_instance, new_prop):
Origin.__init__(self, origin_instance.name)
self.dummy_list = copy.deepcopy(origin_instance.dummy_list)
self.dummy_stuff = copy.deepcopy(origin_instance.dummy_stuff)
self.new_prop = new_prop
Раздражает то, что мне нужно копировать все то, о чем мне нужно знать заранее.
Другой вариант будет
class BasedOnOrigin2(Origin):
def __init__(self, origin_instance, new_prop):
Origin.__init__(self, origin_instance.name)
self = origin_instance.make_copy()
self.new_prop = new_prop
но часть self =
выглядит довольно нестандартно и new_prop
не установлена, поэтому для этого мне понадобится дополнительная функция.
Есть ли стандартный способ сделать это?
Альтернативой вышеупомянутому может быть добавление дополнительных функций к существующим экземплярам с использованием, например,
from functools import partial
def add_function(obj, func):
setattr(obj, func.__name__, partial(func, obj))
но это может раздражать, если есть (i) много функций для добавления и (ii) много экземпляров, к которым нужно добавить функции.