Эмуляция таблицы базы данных с помощью класса и списка

Задача. Создать список объектов. Каждый объект представляет собой как бы запись в таблице базы данных и включает поля: id, название_предмета, количество раз его ввода (qty).

id и qty должны вычисляться автоматически, пользователь вводит только название предмета.
id очередного предмета можно генерировать исходя из количества уже существующих объектов (элементов списка) + 1.

9. Классы (Classes)

По сравнению с другими языками программирования, механизм классов Python добавляет классы с минимумом нового синтаксиса и семантики. Это смесь механизмов класса похожих на C++ и Modula-3. Классы Python предоставляют все стандартные возможности объектно-ориентированного программирования: механизм наследования классов позволяет использовать несколько базовых классов, производный класс может переопределить любые методы его базового класса или классов, а метод может вызвать метод базового класса с тем же именем. Объекты могут содержать произвольные количество и типы данных.

Форматированный вывод

Старый способ - форматирование строк

Как вывести вещественное число с необходимой точностью

>>> 4 / 3
1.3333333333333333
>>> "%.4f" % 4/3
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    "%.4f" % 4/3
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>> "%.4f" % (4/3)
'1.3333'
>>> "%.4f" % (1.33335)
'1.3334'
>>> "%.4f" % (1.33334)
'1.3333'
>>> print("%.4f" % (1.33334))
1.3333
>>> print("%.4f, %.2f" % (1.33334, 153*0.43))

Вставка элементов в сортированный список

Модуль bisect позволяет вставлять элемент в сортированный по возрастанию список, не нарушая сортировки.

В модуле bisect есть два основных метода:

Обработка исключений, создание класса исключения

class MyError(Exception):
    def __init__(self,text):
        MyError.txt = text
 
a = input("Input positive integer: ")
 
try:
    a = int(a)
    if a < 0:
        raise MyError("you give negative!") # возбуждает собственное исключение
except ValueError:
    print("Error type of value!")
except MyError:
    print(MyError.txt)
 
print(a)
class General: pass
class Specific1(General): pass
class Specific2(General): pass
 
def raiser0():
    x = General()
    raise x
 
def raiser1():
    x = Specific1()
    

Пример наследования и композиции в ООП

стр. 641-644

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

Теги

Перехват обращений к атрибутам

class Getat:
    def __getattr__ (self, attrname):
        print ("No this attr")
    def __setattr__ (self, attr, value):
        self.__dict__[attr + '_usr'] = value
 
x = Getat()
x.name
x.age
 
x.name = "Max"
x.age = 21
 
print(x.__dict__)
print(x.name_usr, x.age_usr)

 

__getattr__ вызывается, когда пытаются получить значение по несуществующему атрибуту.

__setattr__ обрабатывает присваивание значений несуществующим до этого момента атрибутам.

Результа скрипта:

Теги

Пример создания класса, объекты которого можно складывать и умножать

### Идея такова:
###    создается объект класса Num2nums
###    его свойству value устанавливается числовое значение
###    методы summa и multi складывают и умножают цифры числа
###    при этом используют скрытые методы _sum и _mult
###    методы __add__ и __mul__ позволяют участвовать объектам в операциях сложения и умножения
 
class Num2nums():
    def _sum (a):
        b = 0
        while a > 0:
            b = b + a % 10
            a = a // 10
        return b
    def _mult (a):
        b = 1
        while a > 0:
            b = b * (a % 10)
    

Теги

Простые примеры создания классов, подклассов и переопределения операторов

class First():
    def setdata(self,string):
        self.name = string
    def display(self):
        print(self.name)
 
class Second(First):
    def display(self):
        print("Current value: %s" % self.name)
 
class Third(Second):
    def __init__(self,value):
        self.name = value
    def __add__(self,other):
        self.name = self.name + other # не создается новый объект
    def __mul__(self,n):
        self.name = self.name * n
 
class Fourth(Third):
    def __add__(self,other):
        return Fourth(self.name + other) # создается новый объект

Теги