Проблема
В настоящее время я работаю с деревьями решений и хочу добавить некоторые методы во встроенный класс python: sklearn.tree._tree.Tree
, например, один, который будет вычислять число общих узлов для двухsamples.
Допустим, у нас есть класс A
, который является встроенным классом Python.У меня есть объект a
.Я хотел бы добавить метод к объекту a
, поэтому я создаю класс B
, который наследуется от A
.Но затем я хочу инициализировать b
, используя a
и без ссылки на __init__
метод A
.
Фон
Я виделТо, что я искал, имело в основном два вида решений:
- То, что называется «monkeypatching», но, помимо того, что его называют злым, оно не может работать на встроенных в Python классах, реализованных на Си.
- Создание подклассов путем создания нового класса, наследуемого от другого. Это то, что я пытался сделать .
Я также видел более или менее сложные решения, которые копировали объект объекта или изменяли __class__
атрибут основного класса.
Конечно, я мог бы просто определить новый класс B
, который бы имел a
в качестве атрибута.Но я не думаю, что это удовлетворит для будущей поддержки?И, тем не менее, я долго искал, и мне очень любопытно узнать, есть ли хорошее решение Python для моего вопроса.
Пример кода
type(a) # class A
class B(A):
def __init__(self, a:A):
# Making my b object having the attribute of a
def new_method():
...
b.attribute_of_A # Should work
b.new_method() # Should work too
Решение и обходной путь
Если это просто невозможно, я был бы очень рад узнать, почему.В этом случае я получу что-то вроде:
class B:
def __init__(self, a:A):
self._a = a
self.interesting_a_attribute = a.interesting_a_attribute
def new_method():
...