Тяжело вечером
тяпницы переваривать эдакие материи.
Но ведь интересно
Вдохновлённый
недавним постом про текучие
интерфейсы на PHP, я сразу задумался
как можно реализовать подобное на питоне
проще и красивее (на питоне всегда всё
проще и красивее). Предлагаю несколько
способов в порядке поступления мыслей.
...
Теперь мы
обработаем все методы сразу, но будем
проверять модификацию и создание методов
для того чтобы и их обернуть.
class NewMetaChain(type):
def __new__(cls,name,bases,dict):
old = dict.get('__setattr__',object.__setattr__)
def wrap(fn,inst=None):
def new(*args,**kwargs):
ans = fn(*args,**kwargs)
return ans if ans!=None else inst or args[0]
return new
special = dir(cls)
for item, fn in dict.items():
if item not in special and isinstance(fn,FunctionType):
dict[item] = wrap(fn)
def new_setattr(inst,item,val):
if isinstance(val,FunctionType):
val = wrap(val,inst)
return old(inst,item,val)
dict['__setattr__'] = new_setattr
return type.__new__(cls,name,bases,dict)
class UsefulClass4():
__metaclass__ = NewMetaChain
def __setattr__(self,item,val):
if val == 172: val = "giza"
object.__setattr__(self, item, val)
val = 1
def add(self,val): self.val += val
def mul(self,val): self.val *= val
def nul(self): pass
Помимо того что мы теперь при каждом вызове не оборачиваем методы (что дало ~30% прироста в скорости), мы ещё проводим необходимые проверки не на каждом считывании полей объекта, а на каждой записи (что происходит реже). Если запись отсутствует — работает так же быстро как и способ с декораторами.
Как справедливо
заметили в каментах
zw0rk 10 ноября
2011 в 19:42
Метод с
дек@ратором гораздо лучше, потому что
explicit is better than implicit. Имхо.
Grundiss 10 ноября
2011 в 21:10
Тоже считаю,
что лучше уж написать 10 «собачек», чем
портить себе карму отзывами будущих
поколений.
just_wow 11 ноября
2011 в 09:41
Раз уж речь
зашла о Python-way, то не лучше ли будет просто
дописать «return self» в конце каждой функции?
Цена тому — все таже одна строка кода,
зато простоту понимания сторонним
читателем повысит неимоверно, нежели
декоратор.
zw0rk 11 ноября
2011 в 13:16
Лучше конечно,
но не так «илитарно» :)
Комментариев нет:
Отправить комментарий