Нет кастинга, как уже объяснили другие ответы.Вы можете создавать подклассы или создавать модифицированные новые типы с дополнительной функциональностью, используя декораторы .
Вот полный пример (кредит Как создать цепочку декораторов функций? ).Вам не нужно изменять свои оригинальные классы.В моем примере исходный класс называется Working.
# decorator for logging
def logging(func):
def wrapper(*args, **kwargs):
print func.__name__, args, kwargs
res = func(*args, **kwargs)
return res
return wrapper
# this is some example class you do not want to/can not modify
class Working:
def Do(c):
print("I am working")
def pr(c,printit): # other example method
print(printit)
def bla(c): # other example method
c.pr("saybla")
# this is how to make a new class with some methods logged:
class MutantWorking(Working):
pr=logging(Working.pr)
bla=logging(Working.bla)
Do=logging(Working.Do)
h=MutantWorking()
h.bla()
h.pr("Working")
h.Do()
, это напечатает
h.bla()
bla (<__main__.MutantWorking instance at 0xb776b78c>,) {}
pr (<__main__.MutantWorking instance at 0xb776b78c>, 'saybla') {}
saybla
pr (<__main__.MutantWorking instance at 0xb776b78c>, 'Working') {}
Working
Do (<__main__.MutantWorking instance at 0xb776b78c>,) {}
I am working
Кроме того, я хотел бы понять, почему вы не можете изменить класс.Ты пробовал?Потому что, как альтернатива созданию подкласса, если вы чувствуете себя динамичным, вы можете почти всегда изменять старый класс на месте:
Working.Do=logging(Working.Do)
ReturnStatement.Act=logging(ReturnStatement.Act)
Обновление: Примените ведение журнала ко всем методам класса
Как вы сейчас специально просили об этом.Вы можете перебрать всех участников и применить регистрацию для всех них.Но вам нужно определить правило для того, какие типы членов следует изменить.В приведенном ниже примере исключается любой метод с именем __.
import types
def hasmethod(obj, name):
return hasattr(obj, name) and type(getattr(obj, name)) == types.MethodType
def loggify(theclass):
for x in filter(lambda x:"__" not in x, dir(theclass)):
if hasmethod(theclass,x):
print(x)
setattr(theclass,x,logging(getattr(theclass,x)))
return theclass
С этим все, что вам нужно сделать, чтобы создать новую зарегистрированную версию класса:
@loggify
class loggedWorker(Working): pass
Или изменитьсуществующий класс на месте:
loggify(Working)