bmstu.py lecture 4

aori.ru

			bmstu.py
		

План лекции

но сначала...

ООП

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

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

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

class User(object):
    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(object):
    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(object):
    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(object):
    data = {'email': '', 'login': ''}
    ...

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

 

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

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

 

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

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

 

class User(object):
    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(object):
    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(object):
    data = {'email': '', 'login': ''}

 

class User(object):
    data = {'email': '', 'login': ''}

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

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

class User(object):
    data = {'email': '', 'login': ''}

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

 

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

 

class User(object):
    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(object):
    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(object):
    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

это обман чтобы набрать классы


class User():
    ...


class Article(object):
    ...
        

это обман чтобы набрать классы


class User():  # старый класс
    ...


class Article(object):  # новый класс
    ...
        

это обман чтобы набрать классы


class User():  # старый класс
    ...


class Article(object):  # новый класс
    ...
        

ООП в Python

__new__ vs. __init__

__new__ vs. __init__


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

ООП в Python

_ vs. __

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

u = User()
        

_ vs. __

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

u = User()
        

_ vs. __

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

u = User()
        

_ vs. __

class User(object):
    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(object):
    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(object):
    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(object):
    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(object):
    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(object):
    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(object):
    is_banned = True

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

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

class User(object):
    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

Комментарии


def get_user_name(user_id):
    """
        Получить имя пользователя по его id.
        Функция принимает на вход user_id и возвращает username.
    """
    user = db.users.get(user_id)
    return user.username  # вытаскиваем id статьи
        

Комментарии


def get_user_name(user_id):
    """
        Получить имя пользователя по его id.
        Функция принимает на вход user_id и возвращает username.
    """
    user = db.users.get(user_id)
    return user.username  # вытаскиваем id статьи
        

Комментарии


def get_user_name(user_id):
    """
        Получить имя пользователя по его id.
        Функция принимает на вход user_id и возвращает username.
    """
    user = db.users.get(user_id)
    return user.username  # вытаскиваем id статьи
        

Комментарии

Комментарии

Комментарии

Комментарии


def user_act():
    """Состояние пользователя"""
    a = gui()  # get user id
    s = fun(a)  # статус пользователя
    return s == 14  # 14 - заблокирован

Комментарии


def is_current_user_blocked():
    user_id = get_current_user_id()
    return is_user_blocked(user_id)

Комментарии

Практикум

Тестирование

 

Максим Ильяхов

1. Тетрис

2. Рефакторинг

def srch():
    zapros = raw_input()
    s = json.load(open('articles.json' , 'r'))
    find = []
    for i in range(0, len(s)):
        if zapros in s[i]['title']:
            find.append(s[i])
    return find

3. Рефакторинг

def srch():
    zapros = raw_input()
    s = json.load(open('articles.json' , 'r'))
    find = []
    for i in range(0, len(s)):
        if zapros in s[i]['title']:
            find.append(s[i])
    return find