Ruby vs Python (era: Comentarios sobre web frameworks)
Chema Cortes
py en ls-l.org
Mar Sep 27 19:57:28 CEST 2005
Esteban Manchado Velázquez escribió:
> ¿Puedes poner ejemplos? No se me ocurre cómo puedes poner pre y post
> condiciones, p.ej, con herencia múltiple :-?
No es el mejor ejemplo, pero así, en sucio:
class M(object):
@staticmethod
def deco(fun):
"""Decorador que valida que el argumento es positivo"""
def wrapper(self,v):
assert 0<v
return fun(self,v)
return wrapper
class __metaclass__(type):
def __new__(meta,name,bases,dic):
for cls in bases:
for k,m in cls.__dict__.items():
if k.startswith('f'):
dic[k]=M.deco(m)
return type.__new__(meta,name,bases,dic)
class A(object):
def f1(self,v):
print "valor %d" % v
a=A()
a.f1(1)
a.f1(-1)
class B(M,A):
pass
b=B()
b.f1(1)
b.f1(-1) # <-- AssertionError
Fíjate que aquí la clase M sirve para cualquier "interface" arbitrario
sobre el que se aplique, incluso para nuevos métodos incorporados desde
las clases derivadas de B.
Supongo que en ruby se puede trastear con el "dispatch" ó alguna cosa
similar, pero aún no he tenido tiempo de pensar mucho en ello.
> Probablemente esas cosas no se harían con herencia
> o mixins (en general, redefinir cosas en Ruby es muy fácil) en Ruby, pero no
> sé muy bien a qué te refieres.
No es que diga que no se pueda, ni que estos ejemplos sean la mar de
elegantes. Mi única intención es conocer mejor los límites (que los hay)
de los lenguajes que utilizamos.
Más información sobre la lista de distribución Python-es