python - monkey - duck typing ruby
¿Esto es pato-tipado en Python? (3)
Cuando define un método en Python, debe proporcionar el objeto sobre el que se aplica, que, en su caso, es self
.
Por lo tanto, debe adaptar su código con la siguiente línea para tener el comportamiento esperado:
class Duck:
def help(self):
print("Quaaaaaack!")
class Person:
def help(self):
print("Heeeelp!")
Aquí hay un código de Ruby:
class Duck
def help
puts "Quaaaaaack!"
end
end
class Person
def help
puts "Heeeelp!"
end
end
def InTheForest x
x.help
end
donald = Duck.new
john = Person.new
print "Donald in the forest: "
InTheForest donald
print "John in the forest: "
InTheForest john
Y lo traduje a Python:
import sys
class Duck:
def help():
print("Quaaaaaack!")
class Person:
def help():
print("Heeeelp!")
def InTheForest(x):
x.help()
donald = Duck()
john = Person()
sys.stdout.write("Donald in the forest: ")
InTheForest(donald)
sys.stdout.write("John in the forest: ")
InTheForest(john)
El resultado es el mismo. ¿Esto significa que mi código de Python está usando pato-tipado? No pude encontrar un ejemplo de tipado de pato, así que pensé que no podría haber tipado de pato en Python. Hay un código en Wikipedia, pero no pude entenderlo.
El código no muestra toda la historia. Duck typing se trata de probar algo y manejar excepciones si ocurren. Mientras graznando, trátelo como un pato, de lo contrario, trátelo de manera diferente.
try:
dog.quack()
except AttributeError:
dog.woof()
Este comportamiento se explica en la parte superior del artículo de wikipedia Duck_typing que sigue a una descripción de un lenguaje que no está escrito en pato:
En un lenguaje de pato, la función equivalente tomaría un objeto de cualquier tipo y llamaría a los métodos de andar y caminar de ese objeto. Si el objeto no tiene los métodos que se invocan, la función indica un error en tiempo de ejecución. Si el objeto tiene los métodos, entonces se ejecutan sin importar el tipo de objeto, evocando la cita y, por lo tanto, el nombre de esta forma de tipado.
Para tu ejemplo:
class Person:
def help(self):
print("Heeeelp!")
class Duck:
def help(self):
print("Quaaaaaack!")
class SomethingElse:
pass
def InTheForest(x):
x.help()
donald = Duck()
john = Person()
who = SomethingElse()
for thing in [donald, john, who]:
try:
InTheForest(thing)
except AttributeError:
print ''Meeowww!''
salida:
Quaaaaaack!
Heeeelp!
Meeowww!
Sí, esto es tipado de patos, que el código de Python puede (y suele usar) usar.
http://en.wikipedia.org/wiki/Duck_typing#In_Python
Más arriba en la página hay un ejemplo más completo en Python:
class Duck:
def quack(self):
print("Quaaaaaack!")
def feathers(self):
print("The duck has white and gray feathers.")
class Person:
def quack(self):
print("The person imitates a duck.")
def feathers(self):
print("The person takes a feather from the ground and shows it.")
def name(self):
print("John Smith")
def in_the_forest(duck):
duck.quack()
duck.feathers()
def game():
donald = Duck()
john = Person()
in_the_forest(donald)
in_the_forest(john)
game()