Добавление метода во встроенный класс с помощью наследования: как инициализировать? - PullRequest
0 голосов
/ 09 мая 2019

Проблема

В настоящее время я работаю с деревьями решений и хочу добавить некоторые методы во встроенный класс 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():
        ...
...