Я хотел бы найти все экземпляры в коде, где вызывается 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
Это хороший стиль?






Это могло бы быть более простым решением вашего второго вопроса:
# 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()