Исправление встроенного метода или класса

Я хотел бы найти все экземпляры в коде, где вызывается np.random.seed (без использования grep). Чтобы установить точку останова в ipdb, я попытался найти исходный файл с помощью

import inspect; inspect.getsourcefile(np.random.seed)

но он выдает ошибку TypeError, потому что это встроенный метод (потому что он закодирован на C).

Можно ли наблюдать за вызовами np.random.seed, изменяя что-то в основном исходном файле? Кроме того, было бы целесообразно исправить этот метод, например дополнительно регистрируя его (или вызывая отладчик):

def new_random_seed(seed):
    """
    This method should be called instead whenever np.random.seed 
    is called in any module that is invoked during the execution of 
    the main script
    """
    print("Called with seed {}".format(seed))
    #or: import ipdb; ipdb.set_trace()
    return np.random.seed()

Может быть, использовать фиктивный фреймворк?

Второй вопрос касается сценария, в котором класс B наследуется от класса A в библиотеке, и я хочу использовать функциональность класса B, но перезаписать используемую им функцию из класса A без изменения классов A и B. используйте насмешку, но я не уверен в накладных расходах, поэтому написал следующее:

#in library
class A():
    def __init__(self, name):
        self.name = name
    def work(self):
        print("{} working".format(self.name))

class B():
    def __init__(self):
        self.A = A("Machine")
    def run_task(self):
        self.A.work()

# in main script
# Cannot change classes A and B, so make a subclass C
import types
class C(B):
    def __init__(self, modified_work):
        super().__init__()
        self.A.work = types.MethodType(modified_work, self.A) #MethodType for self

b = B()
b.run_task()
modified_work = lambda self: print("{} working faster".format(self.name))
c = C(modified_work)
c.run_task()

Результат:

Machine working
Machine working faster

Это хороший стиль?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
34
1

Ответы 1

Это могло бы быть более простым решением вашего второго вопроса:

# lib.py
class A():
    def work(self):
        print('working')

class B():
    def __init__(self):
        self.a = A()
    def run(self):
        self.a.work()

Затем в вашем коде:

import lib

class A(lib.A):
    def work(self):
        print('hardly working')

lib.A = A

b = lib.B()
b.run()

Или же:

import lib

class AA(lib.A):
    def work(self):
        print('hardly working')

class BB(lib.B):
    def __init__(self):
        self.a = AA()

b = lib.B()
b.run()
b = BB()
b.run()

Другие вопросы по теме