Является ли это утиная печать на Python?

Вот какой код 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 

И я перевел его на 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) 

Результат тот же. Означает ли это, что мой код Python использует утиную печать? Я не мог найти пример утиной печати, поэтому я подумал, что в Python не может быть утка. В Википедии есть код , но я не мог этого понять.

3 Solutions collect form web for “Является ли это утиная печать на Python?”

Код не показывает всю историю. Утиная печать – это попытка попробовать что-то и обработать исключения, если они произойдут. До тех пор, пока это ошеломляет, относитесь к нему как к утке, иначе относитесь к нему по-другому.

 try: dog.quack() except AttributeError: dog.woof() 

Это поведение объясняется в верхней части статьи wiki-статьи wiki для описания языка, не относящегося к уткам:

В языке с утиным языком эквивалентная функция принимает объект любого типа и вызывает методы ходьбы и шарлата объекта. Если у объекта нет методов, которые вызывают, функция сигнализирует ошибку во время выполнения. Если у объекта есть методы, то они выполняются независимо от типа объекта, вызывая цитату и, следовательно, имя этой формы ввода.

Для вашего примера:

 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!' 

вывод:

 Quaaaaaack! Heeeelp! Meeowww! 

Да, это утка набрав, который код Python может (и часто делает) использовать.

http://en.wikipedia.org/wiki/Duck_typing#In_Python

Далее на странице есть более полный пример в 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() 

Когда вы определяете метод в Python, вы должны предоставить объект, к которому он применяется, который в вашем случае является self .

Поэтому вам нужно адаптировать свой код со следующей строкой, чтобы иметь ожидаемое поведение:

 class Duck: def help(self): print("Quaaaaaack!") class Person: def help(self): print("Heeeelp!") 
  • Есть ли реализация «ожидать» или ожидающая библиотека, которая работает в python3?
  • Как получить данные внутри тега </ br>, который находится внутри <li>, используя скребок python
  • имя файла vs file object как аргумент функции
  • Проверьте требования к поддержке python 3
  • Установить кодировку в сценариях Python 3 CGI
  • imaplib.select на большой почтовый ящик: слишком много аргументов для команды
  • Как проверить код асинхронного кода Python 3.4?
  • Keras: ImportError: нет модуля с именем data_utils
  • Python - лучший язык программирования в мире.