Это утиная печать в 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 нет утиной печати. В Википедии есть код, но я не смог его понять.


person a1204773    schedule 10.06.2013    source источник
comment
Python — это утиная типизация. Пример, который вы написали, типичен.   -  person darxsys    schedule 10.06.2013
comment
@darxsys, так почему нет такого примера? В википедии есть код, но я не мог понять, как он работает   -  person a1204773    schedule 10.06.2013


Ответы (3)


Код не показывает всю историю. Утиная типизация — это попытка что-то сделать и обработка исключений, если они возникают. Пока он крякает, относитесь к нему как к утке, иначе относитесь к нему иначе.

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

Это поведение объясняется в верхней части статьи википедии о Duck_typing после описания не-duck_typing. типизированный язык:

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

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

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!
person dansalmo    schedule 10.06.2013

Да, это утиная типизация, которую код 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()
person Andrew Clark    schedule 10.06.2013
comment
Я не мог понять код из википедии, поэтому и спрашиваю - person a1204773; 10.06.2013

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

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

class Duck:
    def help(self):
        print("Quaaaaaack!")

class Person:
    def help(self):
        print("Heeeelp!")
person Raphael Pr    schedule 10.06.2013
comment
Верно, но не ответ. Кроме того, как говорит OP, результат тот же, я предполагаю, что ошибка присутствует только в коде вопроса, а не в фактическом коде OP. - person ; 10.06.2013
comment
Я понимаю, как это работает, я просто не мог найти пример на питоне с использованием утиной печати... Я искал в Google, но не нашел результата, затем попытался перевести ruby ​​на python, и это сработало.. Мне просто любопытно, что я написал, это утиная печать или нет. - person a1204773; 10.06.2013