ООП. Композиция. Паттерн Стратегия.

Создать игру “Зоопарк” в котором все звери могут издавать определенные звуки, ходить и быть отрисованными на экране.

Создадим класс animal, в котором определим три метода и одно свойство.

От него унаследуем пустой класс cat.

Теперь допустим что возникла необходимость добавить зверям дополнительную функцию полета.

Нет ничего проще добавить эту функцию в базовый класс.

Но при таком подходе все звери получат такую возможность. Даже те, которые летать не должны.

class animal(object):

    sound = 'uuuuuuuuuuuuu!'
    def say(self):
        print self.sound

    def move(self):
        print 'I go a head!'

    def display(self):
        print '''##########DISPLAY########'''
class cat(animal):
    pass

Композиция - это составление целого из частей.

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

В результате получается, что при создании объекта класса-контейнера, также создаются объекты включенных в него классов.

Допустим у нас есть класс месенжера, который должен отправлять сообщения, используя разные мессенжеры (telegramm email и пр.).

Можно его описать следующим образом.

При таком подходе существует ряд проблем.

class BaseMessanger():

    def send(self, type, message):

        if type == 'email':
            print("Посылаю %s на email" % message)

        if type == 'telegram':
            print("Посылаю %s на telegram" % message)

m = BaseMessanger()
m.send('email','Hello!')
class BaseMessanger(object):


    def __init__(self,message,sender):
        self.message = message
        self.sender = sender

    def send(self):
        self.sender.send(self.message)


class EmailSender():

    def send(self,message):
        print 'I am sending this %s via email' % message

class SkypeSender():

    def send(self,message):
        print 'I am sending this %s via skype' % message

class SmsSender():

    def send(self,message):
        print 'I am sending this %s via sms' % message

email_sender = EmailSender()
message = BaseMessanger('hello',email_sender)
message.send()

Этот оператор используется для тестирования и проверки определенного условия в программе.

Он эквивалентен конструкции raise-if-not и вызывает исключение при несоблюдении условия.

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

Синтаксис:

Если проверка не прошла, то Python использует параметр Arguments в качества аргументов для исключения AssertionError.

AssertionError может быть обработан как любое другое исключение выражением try-except.

assert Expression[, Arguments]
#!/usr/bin/python

def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32

print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))

Для того чтобы пройти в цикле по коллекции, обычно используется цикл for.

По списку.

По строке.

По файлу.

Что если по какой либо причине мы не хотим использовать цикл for для прохода по коллекции?

Для этого нужно иметь специальный метод (next), в котором по порядку возвращать ее элементы до тех пор пока не достигнем конца коллекции.

for i in [1, 2, 3, 4]:
    print i,
for c in "python":
    print c
Потратить 2 кредита и начать обучение!
Задать вопрос, прокомментировать.