Я только что прочитал статью в Википедии о duck typing, и мне кажется, что я пропустил важный момент в концепции интерфейса, которую я использовал в Java:
"When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck."
class Duck:
def quack(self):
print("Quaaaaaack!")
def feathers(self):
print("The duck has white and gray feathers.")
def swim(self):
print("Swim seamlessly in the water")
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()
что, если в in_the_forest
я пишу:
- это
quack
как утка? да - У него есть утка
feathers
? да - отлично, это утка у нас есть!
и позже, потому что я знаю, что это утка, я хочу, чтобы она была swim
? john
будет тонуть!
Я не хочу, чтобы мое приложение разбивалось (случайно) в середине своего процесса только потому, что Джон подделывался как утка, но я думаю, не было бы мудрой идеей проверять все атрибуты объекта, когда Я получаю его...?