Является ли это утиная печать на 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!") 
  • Разница между sys.stdout.write и печать при печати переменных
  • Python: найдите эквивалентную суррогатную пару от символа unicode без BMP
  • Где нелокалы ()?
  • Что я должен использовать вместо .__ getslice__?
  • Фильтры в Python3
  • Портирование проекта на основе Python 2.X на Python 3
  • Как перевести этот код с Python 2.7 на Python 3.5, чтобы исправить -> AttributeError: объект '_io.TextIOWrapper' не имеет атрибута 'next'
  • Компиляция Python для .NET для .NET3.5 и Python3.x
  • Python - лучший язык программирования в мире.