study sources
2 subscribers
1 photo
14 links
SQL.
JavaScript.
Python.
C#.
Download Telegram
DRY — "Не повторяйся".

Это один из основных принципов ООП, есть ещё как минимум 3 — KISS, SOLID, REST.
Как можно соблюдать принцип DRY? Очень просто, просто использовать тоже самое наследование.

Я пока что тупой, не знаю что за остальные три принципа.
"При создании класса, мы создаём пространство имён" - или же это просто локальные переменные, которые доступны внутри класса и его методов.
class Point:
color = 'red'
circle = 2


print(Point.color)

Point.color = 'blue'

print(Point.color)
Этот код сначала выводит значение переменной color, класса Point, потом меняет и выводит опять.
Создать экземпляр класса
point = Point()
import os
import requests
from urllib.request import urlopen
from lxml import etree


class Functional:
img = "/html/body/div/div[1]/div/main/header/img"
word = "/html/body/div/div[1]/div/main/div[1]/div[1]/div[2]/b"
translate = "/html/body/div/div[1]/div/main/div[1]/div[1]/div[1]/span"
transcription = "/html/body/div/div[1]/div/main/div[1]/div[2]/div[2]/b"
headers = {'Content-Type': 'text/html',}
BASEDIR = os.path.abspath(os.path.dirname(__file__))

def __init__(self, link, path_to_folder=None) -> None:
self.response = requests.get(link, headers=self.headers)
self.path_to_folder = path_to_folder

def get_data(self):
with open("index.html", "w", encoding="utf-8") as file:
file.write(self.response.text)

local = os.path.join(self.BASEDIR, "index.html")
response = urlopen(local)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)

# print(tree.xpath(self.word))

def __saveData(self):
...

def __saveImg(self):
...

def correct_str(self, s):
return s.encode('utf-8').decode('ascii', 'ignore').strip()


if __name__ == "__main__":
a = Functional(link="https://www.toboapp.com/word/korean/russian/yeou-604/")
a.get_data()
import os
import requests
import bs4
from lxml import etree
import csv


class Functional:
img = "/html/body/div/div[1]/div/main/header/img"
word = "/html/body/div/div[1]/div/main/div[1]/div[1]/div[2]/b"
translate = "/html/body/div/div[1]/div/main/div[1]/div[1]/div[1]/span"
transcription = "/html/body/div/div[1]/div/main/div[1]/div[2]/div[2]/b"
headers = {'Content-Type': 'text/html'}
BASEDIR = os.path.abspath(os.path.dirname(__file__))

def __init__(self, link, path_to_folder=BASEDIR) -> None:
self.response = requests.get(link, headers=self.headers)
self.path_to_folder = path_to_folder

def get_data(self):
result = []
soup = bs4.BeautifulSoup(self.response.text, features="lxml")
dom = etree.HTML(str(soup))

word = dom.xpath(self.word)[0].text
translate = dom.xpath(self.translate)[0].text
transcription = dom.xpath(self.transcription)[0].text
img = soup.find("img")["src"]

result.append(
[word, transcription, translate]
)

Functional.save_data(self, result)
# Functional.save_img(self, img)

def save_data(self, result):
with open("test.csv", "r", encoding="utf-8") as file:
if not file.read():
print(False)
with open("test.csv", "w", encoding="utf-8") as file:
writer = csv.writer(file)

writer.writerow(
(
"Слово",
"Транскрипция",
"Перевод"
)
)

writer.writerows(
result
)

else:
print(True)
with open("test.csv", "a", encoding="utf-8") as file:
writer = csv.writer(file)

writer.writerows(
result
)


if __name__ == "__main__":
a = Functional(link="https://www.toboapp.com/word/korean/russian/kokkiri-846/")
a.get_data()
Осталось сохранять фото, сделать выбор директории и на это всё посадить GUI интерфейс
class Functional:
img = "/html/body/div/div[1]/div/main/header/img"
word = "/html/body/div/div[1]/div/main/div[1]/div[1]/div[2]/b"
translate = "/html/body/div/div[1]/div/main/div[1]/div[1]/div[1]/span"
transcription = "/html/body/div/div[1]/div/main/div[1]/div[2]/div[2]/b"
headers = {'Content-Type': 'text/html'}
BASEDIR = os.path.abspath(os.path.dirname(__file__))

def __init__(self, link, img_name, path_to_folder=BASEDIR) -> None:
self.response = requests.get(link, headers=self.headers)
self.path_to_folder = path_to_folder
self.img_name = img_name

def get_data(self):
result = []
soup = bs4.BeautifulSoup(self.response.text, features="lxml")
dom = etree.HTML(str(soup))

word = dom.xpath(self.word)[0].text
translate = dom.xpath(self.translate)[0].text
transcription = dom.xpath(self.transcription)[0].text
element = dom.xpath(self.img)[0]
img = etree.tostring(element, encoding='utf-8').decode('utf-8')

s = bs4.BeautifulSoup(img, 'html.parser')

img = s.img['src']

result.append(
[word, transcription, translate]
)

Functional.save_data(self, result)
Functional.save_img(self, img)

def save_data(self, result):
with open("test.csv", "r", encoding="utf-8") as file:
if not file.read():
print(False)
with open("test.csv", "w", encoding="utf-8") as file:
writer = csv.writer(file)

writer.writerow(
(
"Слово",
"Транскрипция",
"Перевод"
)
)

writer.writerows(
result
)

else:
print(True)
with open("test.csv", "a", encoding="utf-8") as file:
writer = csv.writer(file)

writer.writerows(
result
)

def save_img(self, src_img):
response = requests.get(src_img, stream=True)
with open(f"{self.img_name}.svg", 'wb') as file:
file.write(response.content)
готовый класс
Вместо того, чтобы юзать всеми любимый джангорест, я юзаю фласк
Как работают SQL Joins: шпаргалка:
SQL Join используется для поиска информации в базах данных по заранее определенным критериям. В частности, Join отвечает за объединение нескольких групп данных в единый поток информации.

🔹INNER JOIN возвращает совпадающие строки в обеих таблицах

🔹LEFT JOIN возвращает все записи из левой таблицы и соответствующие записи из правой

🔹RIGHT JOIN возвращает все записи из правой таблицы и соответствующие записи из левой

🔹FULL OUTER JOIN возвращает все записи, в которых есть совпадения, в левой или правой таблице
Что такое SOLID?

SOLID — это акроним принципов объектно-ориентированного программирования, которые помогают писать гибкий, поддерживаемый и расширяемый код:

S — Single-responsibility principle (Принцип единственной ответственности).
O — Open-closed principle (Принцип открытости/закрытости).
L — Liskov substitution principle (Принцип подстановки Лисков).
I — Interface segregation principle (Принцип разделения интерфейса).
D — Dependency Inversion Principle (Принцип инверсии зависимостей).

Основные идеи SOLID:
— Каждый класс должен нести единственную ответственность.
— Классы должны быть открыты для расширения, но закрыты для модификации.
— Подклассы должны быть взаимозаменяемы со своими базовыми классами.
— Множество узких интерфейсов лучше, чем один широкий.
— Зависимости должны строиться на абстракциях, а не конкретных классах.
P. S.
Лена, я не занимался, честно, ну только если чуть чуть
Короче, 4 причины почему не стоит использовать конструкторы по типу Тильда.

Ну первое, это грёбаные конструкторы, на которых ты сможешь сделать только базовый интернет магазин или лендинг, без динамической подгрузки, то есть если у тебя более 100 товаров, не вздумай юзать конструкторы.

Второе, это невозможность сделать профиль с персонализацией, отслеживанием чего-либо и т.п. (Я сжу это по Тильде, ибо это самый популярный конструктор, не путать wordpress с ними).

Третье, они не любят высоконагруженные проекты, просто напросто не выдерживают и падают.

Четвёртое, если вы разрабатываете социальные сети или сложные сервисы, тут я не смогу чего-то сказать, если человек выбрал конструктор для этого, я просто похлопаю
Если юзаешь конструкторы на постоянку, пипка отсохнет
👍2