Посмотрите пример из Википедии: это очень полезно на высоком уровне:
class Animal:
def __init__(self, name): # Constructor of the class
self.name = name
def talk(self): # Abstract method, defined by convention only
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def talk(self):
return 'Meow!'
class Dog(Animal):
def talk(self):
return 'Woof! Woof!'
animals = [Cat('Missy'),
Cat('Mr. Mistoffelees'),
Dog('Lassie')]
for animal in animals:
print animal.name + ': ' + animal.talk()
# prints the following:
#
# Missy: Meow!
# Mr. Mistoffelees: Meow!
# Lassie: Woof! Woof!
Обратите внимание на следующее: все животные «разговаривают», но говорят по-разному. Поведение «разговора», таким образом, полиморфно в том смысле, что оно понимается по-разному в зависимости от животного . Таким образом, абстрактное понятие «животное» на самом деле не «говорит», но конкретные животные (например, собаки и кошки) имеют конкретную реализацию действия «говорить».
Аналогично, операция «добавить» определяется во многих математических объектах, но в особых случаях вы «добавляете» в соответствии с конкретными правилами: 1 + 1 = 2, но (1 + 2i) + (2-9i) = ( 3-7i).
Полиморфное поведение позволяет вам определять общие методы на «абстрактном» уровне и реализовывать их в конкретных случаях.
Для вашего примера:
class Person(object):
def pay_bill(self):
raise NotImplementedError
class Millionare(Person):
def pay_bill(self):
print "Here you go! Keep the change!"
class GradStudent(Person):
def pay_bill(self):
print "Can I owe you ten bucks or do the dishes?"
Видите ли, миллионеры и аспиранты - оба люди. Но когда дело доходит до оплаты счета, их конкретное действие «оплатить счет» отличается.