styleru.py lecture 3

ilebedev

			styleru.py
		

Сегодня в программе

Сообщения к коммитам

Не надо так

Как правильно

Пишите на английском

Как правильно

Не что сделано, а зачем

Как правильно

В повелительном наклонении

Как правильно

ООП

- парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

Задача

отправлять смс пользователю когда готов его заказ.

Решение

Решение

Решение

Решение

Решение

Решение

Решение

class SmsSender:
    ...

class User:
	...


def on_order_ready(order):
	order.user.send_order_ready_sms(
		order,
		sms_driver=SmsSender()
	)

Классы и объекты

Классы и объекты

class User:
    email = emailField()
    login = string(256)

users = [
    User(email='bmstu.py@gmail.com', login='ilebedev'),
    User(email='root.bmstu.py@gmail.com', login='admin'),
]

Классы и объекты

class User:
    email = emailField()
    login = string(256)

users = [
    User(email='bmstu.py@gmail.com', login='ilebedev'),
    User(email='root.bmstu.py@gmail.com', login='admin'),
]

Классы и объекты

class User:
    email = emailField()
    login = string(256)

users = [
    User(email='bmstu.py@gmail.com', login='ilebedev'),
    User(email='root.bmstu.py@gmail.com', login='admin'),
]

 

class User:
    data = {'email': '', 'login': ''}
    ...

users = [User(...), ...]

 

class User:
    data = {'email': '', 'login': ''}
    ...

users = [User(...), ...]
users_data = [u.data for u in users]
json.dump(open('users.json', 'w'), users_data)

 

class User:
    data = {'email': '', 'login': ''}
    ...

users = [User(...), ...]
users_data = [u.data for u in users]
json.dump(open('users.json', 'w'), users_data)

 

class User:
    data = {'email': '', 'login': ''}
    ...
    def save(self):
        with open('user_%s.json' % self.data['login'], 'w') as f:
            json.dump(f, self.data)

users = [User(...), ...]
for user in users:
            user.save()

Инкапсуляция

class User:
    data = {'email': '', 'login': ''}
    ...
    def save(self):
        with open('user_%s.json' % self.data['login'], 'w') as f:
            json.dump(f, self.data)

users = [User(...), ...]
for user in users:
            user.save()

 

class User:
    data = {'email': '', 'login': ''}

 

class User:
    data = {'email': '', 'login': ''}

class Admin(User):
    def ban_user(self, user):
        user.is_banned = True
        user.save()

Наследование

class User:
    data = {'email': '', 'login': ''}

class Admin(User):
    def ban_user(self, user):
        user.is_banned = True
        user.save()

 

class User:
    data = {'email': '', 'login': ''}
    def can_edit_article(self, article):
        return article.author == self

 

class User:
    data = {'email': '', 'login': ''}
    def can_edit_article(self, article):
        return article.author == self

class Admin(User):
    def can_edit_article(self, article):
        return True

 

class User:
    data = {'email': '', 'login': ''}
    def can_edit_article(self, article):
        return article.author == self

class Admin(User):
    def can_edit_article(self, article):
        return True

Полиморфизм

class User:
    data = {'email': '', 'login': ''}
    def can_edit_article(self, article):
        return article.author == self

class Admin(User):
    def can_edit_article(self, article):
        return True

В общем

DISCLAIMER: в концепции ООП есть много чего ещё; это - самые азы.

ООП в Python

__new__ vs. __init__

__new__ vs. __init__


class VkAPIClient:
    def __init__(self, login, password):
        self.access_token = get_access_token(login, password)
        

ООП в Python

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
print u.status  # active
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
print u._current_status  # ???
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
print u._current_status  # banned
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
print u.__spammed_today  # ???
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
print u.__spammed_today  # AttributeError
        

_ vs. __

class User:
    def __init__(self):
        self.status = 'active'  # публичное поле
        self._current_status = 'banned'  # приватное поле
        self.__spammed_today = True  # name mangling

u = User()
print u._User__spammed_today  # True
        

ООП в Python

переменные класса

class User:
    is_banned = True

u = User()
print User.is_banned  # True
print u.is_banned  # True
        

переменные объекта

class User:
    def __init__(self):
        self.is_banned = True

u = User()
print User.is_banned  # AttributeError
print u.is_banned  # True
        

ООП в Python

HTTP

GET /wiki/HTTP HTTP/1.0
Host: ru.wikipedia.org
        

HTTP

Как общаться онлайн (и не бесить всех подряд)