TelenkovDmitry 6 months ago
parent
commit
cc7f714a56

+ 102 - 0
courses/python_oop/abstract/abs.py

@@ -0,0 +1,102 @@
+from abc import ABC, abstractmethod
+
+class Employee(ABC):
+    def __init__(self, name):
+        pass
+
+    @abstractmethod
+    def calculate_salary(self):
+        pass
+
+
+class HourlyEmployee(Employee):
+
+    def __init__(self, hours_worked, hourly_rate):
+        self.hours_worked = hours_worked
+        self.hourly_rate = hourly_rate
+
+    def calculate_salary(self, ):
+        return self.hours_worked * self.hourly_rate
+
+
+class SalariedEmployee(Employee):
+
+    def __init__(self, monthly_salary):
+        self.monthly_salary = monthly_salary
+
+    def calculate_salary(self):
+        return self.monthly_salary
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class Datebase(ABC):
+
+    def __init__(self):
+        pass
+
+    @abstractmethod
+    def connect(self):
+        pass
+
+    @abstractmethod
+    def disconnect(self):
+        pass
+
+    @abstractmethod
+    def execute(self):
+        pass
+
+      
+class MySQLDatabase(Datebase):
+    
+    def connect(self):
+        print("Connecting to MySQL database...")
+
+    def disconnect(self):
+        print("Disconnecting from MySQL database...")
+
+    def execute(self, query):
+        print(f"Executing query '{query}' in MySQL database...")   
+
+class PostgreSQLDatabase(Datebase):
+    
+    def connect(self):
+        print("Connecting to PostgreSQL database...")
+
+    def disconnect(self):
+        print("Disconnecting from PostgreSQL database...")
+
+    def execute(self, query):
+        print(f"Executing query '{query}' in PostgreSQL database...")   
+
+
+
+def main():
+
+    mysql_db = MySQLDatabase()
+    postgresql_db = PostgreSQLDatabase()
+
+    mysql_db.connect()
+    mysql_db.execute(
+        "SELECT * FROM customers;")
+    mysql_db.disconnect()
+
+    postgresql_db.connect()
+    postgresql_db.execute(
+        "SELECT * FROM customers;")
+    postgresql_db.disconnect()
+
+    '''
+    hourly_employee = HourlyEmployee(100, 25)
+    assert hourly_employee.hours_worked == 100
+    assert hourly_employee.hourly_rate == 25
+    assert hourly_employee.calculate_salary() == 2500
+
+    salaried_employee = SalariedEmployee(4000)
+    assert salaried_employee.monthly_salary == 4000
+    assert salaried_employee.calculate_salary() == 4000
+    print('Good')
+    '''
+
+if __name__ == '__main__':
+    main()

+ 85 - 0
courses/python_oop/abstract/iter_1.py

@@ -0,0 +1,85 @@
+
+class Mark:
+
+    def __init__(self, values):
+        self.values = values
+        self.index = 0
+
+    def __iter__(self):
+        print('Call iter Mark')
+        return self
+
+    def __next__(self):
+        print('Call next Mark')
+        if self.index >= len(self.values):
+            raise StopIteration
+        value = self.values[self.index]
+        self.index += 1
+        return value
+
+
+class Student:
+
+    def __init__(self, name, surname, makrs):
+        self.name = name
+        self.surname = surname
+        self.marks = makrs
+
+    # getitem реализует обращение по индексу
+    # Теперь можно итерироваться! Но не только так!
+    def __getitem__(self, item):
+        return self.name[item]
+
+    # елси нет своего __next__, будет вызван next внутри класса строки
+    # __iter__ должен возвращать объект, у которого реализован метод next
+    def __iter__(self):
+        print('Call iter Student')
+        self.index = 0
+        return self.marks
+
+    def __next__(self):
+        print('Call next Student')
+        if self.index >= len(self.name):
+            raise StopIteration
+        letter = self.name[self.index]
+        self.index += 1
+        return letter
+
+
+def test_iter_1():
+
+    mark = Mark([2, 4, 3, 1, 5])
+    igor = Student('Igor', 'Nikolaev', mark)
+
+    # будет вызван метод __iter__, а если его нет __getitem__
+    for i in igor:
+        print(i)
+
+
+def main():
+
+    test_iter_1()
+
+    return
+
+    igor = Student('Igor', 'Nikolaev', [2, 4, 3, 1, 5])
+    
+    a = [1, 2, 3]
+    b = iter(a)
+    
+    try:
+        print(type(b))
+        print(next(b))
+        print(next(b))
+        print(next(b))
+        print(next(b))
+    except StopIteration:
+        print("Стор, нет следующего элемента!!!")
+    
+    # А можно сделать так
+    c = a.__iter__()
+    c.__next__()
+    c.__next__()
+
+if __name__ == '__main__':
+    main()

+ 163 - 0
courses/python_oop/abstract/iter_2.py

@@ -0,0 +1,163 @@
+
+class SequenceIterable:
+
+    def __init__(self, values):
+        self.values = values
+        self.index = 0
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        if self.index >= len(self.values):
+            raise StopIteration
+        item = self.values[self.index]
+        self.index += 1
+        return item
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class Countdown:
+
+    def __init__(self, start):
+        self.start = start
+
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        val = self.start 
+        if val < 0:
+            raise StopIteration
+        self.start -= 1
+        return val
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class PowerTwo:
+
+    def __init__(self, power):
+        self.power = power
+        self.index = 0
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        if self.index > self.power:
+            raise StopIteration
+        value = 2**self.index
+        self.index += 1
+        return value
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
+
+class Card:
+    def __init__(self, rank, suit):
+        self.rank = rank
+        self.suit = suit
+
+    def __str__(self):
+        return f"{self.rank} {self.suit}"
+
+class Deck:
+    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
+    suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
+
+    def __init__(self):
+        self.cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
+
+    def __getitem__(self, index):
+        return self.cards[index]
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
+
+class FileReader:
+
+    def __init__(self, filename):
+        # self.file = open(filename)
+        self.index = 0
+        self.data = []
+        with open(filename, 'r') as self.file:
+            for line in self.file:
+                self.data.append(line)
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        if self.index >= len(self.data):
+            raise StopIteration
+        st = self.data[self.index].strip()
+        self.index += 1
+        return st
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
+
+
+
+def test_6():
+    # reader = FileReader("lorem.txt")
+    for lite in FileReader('lorem.txt'):
+        print(lite)
+    
+
+
+def test_5():
+    deck = Deck()
+    for card in deck:
+        print(card)
+
+def test_4():
+    for i in PowerTwo(4):
+        print(i)
+
+def test_3():
+    for i in Countdown(3):
+        print(i)
+
+def test_2():
+    container = SequenceIterable([1, 2 , 3, True, 'hello'])
+    for i in container:
+        print(i)
+
+def test_1():
+    class MyClass:
+        def __init__(self):
+            self.items = [1, 2, 3]
+            self.index = 0
+
+        def __iter__(self):
+            return self
+
+        def __next__(self):
+            if self.index >= len(self.items):
+                raise StopIteration
+            item = self.items[self.index]
+            self.index += 1
+            return item
+
+
+    for item in MyClass():
+        print(item)    
+
+
+def main():
+    l = [1, 2, 3]
+    s = 'abc'
+    # test_1()
+    # test_2()
+    # test_3()
+    # test_4()
+    # test_5()
+    test_6()
+
+
+
+
+if __name__ == '__main__':
+    main()

+ 37 - 0
courses/python_oop/abstract/lorem.txt

@@ -0,0 +1,37 @@
+Lorem ipsum dolor sit amet consectetur adipiscing elit Cras euismod ex a ante sollicitudin
+sollicitudin gravida massa bibendum Pellentesque quis mi ultricies gravida purus placerat
+   aliquam sapien Morbi fringilla velit at lobortis interdum elit augue faucibus nunc
+et ullamcorper nisl lorem vitae risus Fusce magna justo suscipit vel cursus non
+    consequat tempor nulla Sed vulputate metus et iaculis efficitur Mauris sodales efficitur diam at congue
+Morbi suscipit mi in tortor bibendum tempus Pellentesque placerat consectetur eleifend Curabitur eu sapien enim
+   Quisque non enim justo Aliquam erat volutpat Cras at elit ante
+Nunc eu ultricies massa Pellentesque iaculis malesuada pulvinar
+Vestibulum posuere eu nulla vitae faucibus
+Quisque leo turpis convallis sit amet libero semper cursus elementum urna Nulla facilisi
+Curabitur nec aliquam nibh Maecenas interdum ligula eget dictum consequat Phasellus consequat
+nibh tempor pharetra libero eu sagittis quam Etiam a quam eros Mauris vel risus mi Sed
+sollicitudin convallis congue
+Donec eget felis lectus Vivamus in nulla in urna finibus pulvinar at at sapien Integer pretium
+diam quis mauris fringilla semper Nam mollis purus eu scelerisque viverra tortor sapien pulvinar leo
+et iaculis turpis arcu sit amet est Praesent vehicula arcu in accumsan laoreet est ipsum rutrum libero
+at dignissim dolor nunc ac ligula Maecenas suscipit congue eleifend Duis ac fringilla nibh
+Sed ullamcorper tempor euismod Morbi luctus hendrerit volutpat Maecenas non felis tincidunt
+tempus velit quis fringilla tortor Donec id quam vel quam blandit posuere
+Sed vehicula nulla vel est mollis placerat quis vitae diam Quisque quis ante aliquet rutrum lacus sit amet
+vulputate ante Maecenas gravida rhoncus odio in maximus magna elementum ac Cras interdum ante nunc
+a tempor ipsum pellentesque at Vestibulum commodo augue tincidunt nulla rutrum efficitur Quisque
+sodales tincidunt massa Donec malesuada lacus massa ac elementum quam hendrerit at Pellentesque
+finibus elit convallis egestas accumsan Nulla in ex et mauris lacinia ullamcorper Nulla blandit congue metus
+in semper nunc tincidunt eget Donec ut interdum felis ac mattis lacus Nam eget sapien sit amet
+urna facilisis cursus Phasellus cursus leo aliquet consequat lacinia mauris nisi semper ex ac mattis
+leo ipsum eu neque Etiam eget tempor ex sodales porttitor velit Duis mauris magna varius ac
+convallis sed dignissim ut augue
+In lacinia nisl ut aliquet fringilla diam augue laoreet nibh sed blandit purus nulla vitae nunc
+Cras id scelerisque est a bibendum massa Phasellus at felis elit Cras eros ligula tincidunt at
+ullamcorper vel vulputate dignissim nisi Phasellus egestas semper felis a efficitur Aliquam vitae
+ultrices metus Donec quis risus mi Pellentesque elementum nulla non tempor vestibulum Vestibulum
+volutpat vel libero in laoreet Curabitur arcu ligula ullamcorper sed luctus ut tempus a tellus
+Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas Morbi
+pulvinar ac tortor dapibus vulputate Duis in posuere nibh Praesent rutrum molestie congue Nullam
+magna massa efficitur non ex sit amet ultricies semper odio In faucibus eros sit amet arcu congue
+sit amet vulputate lorem pellentesque

+ 31 - 0
courses/python_oop/abstract/protocol.py

@@ -0,0 +1,31 @@
+from typing import Protocol
+
+class Animal(Protocol):
+
+    def walk(self) -> None:
+        ...
+
+    def speak(self) -> None:
+        ...
+
+        
+class Dog:
+
+    def walk(self):
+        print("This is a dog walking")
+
+    def speak(self):
+        print("Woof!")
+
+
+def make_animal_speak(animal: Animal):
+    animal.speak()
+
+
+def main():
+    dog = Dog()
+    make_animal_speak(dog)
+
+
+if __name__ == '__main__':
+    main()