<jupyter_start><jupyter_text>Объектно-ориентированное программирование  Объявление класса* Все обычные поля класса публичные* Все методы класса виртуальные* Методы явно принимают экземпляр класса как первый аргумент<jupyter_code>class Vector2D:
    x = 0
    y = 0
    
    def norm(self):
        return (self.x**2 + self.y**2)**0.5
def norm(self):
    return (self.x**2 + self.y**2)**0.5
vec = Vector2D()
vec.x = 5
vec.y = 5
vec.norm()
norm(vec)<jupyter_output><empty_output><jupyter_text>Больше о полях и методах Data attributess<jupyter_code>vec.z = 10
vec.z
del vec.z
vec.z<jupyter_output><empty_output><jupyter_text>Все в Python это объекты, классы это тоже объекты<jupyter_code>type(Vector2D) # Vector2D это экземпляр класса type
isinstance(Vector2D, object)
Vector2D.x, Vector2D.y # x и y это атрибутты класса
Vector2D.norm(vec)<jupyter_output><empty_output><jupyter_text>Мутабельные объекты как аттрибуты класса это плохая идея<jupyter_code>class Foo:
    bar = []
foo1 = Foo()
foo2 = Foo()
foo1.bar.append("spam")
foo2.bar<jupyter_output><empty_output><jupyter_text>Методы объекта отличаются от полей-функций объекта<jupyter_code>vec.func = lambda self : print(self.x)
vec.func() # self не передается в поля-функции
type(vec.norm)
type(vec.func)<jupyter_output><empty_output><jupyter_text>Но метод остается методом<jupyter_code>func_norm = vec.norm
type(func_norm)
func_norm()<jupyter_output><empty_output><jupyter_text>Методы это функции класса<jupyter_code>type(vec.norm)
type(Vector2D.norm)
vec.norm() == Vector2D.norm(vec)
def another_norm(self):
    return abs(self.x + self.y)
Vector2D.another_norm = another_norm
type(Vector2D.another_norm)
vec = Vector2D()
vec.another_norm()
type(vec.another_norm)<jupyter_output><empty_output><jupyter_text>Приватные поля* `_spam` --- поля чьё имя начинается с подчеркивания подразумеваются как не публичные<jupyter_code>class Foo:
    spam = "public"
    _spam = "типа приватное"
foo = Foo()<jupyter_output><empty_output><jupyter_text>Магические методы<jupyter_code>class Foo:
    pass
dir(Foo)
def fun():
    pass
dir(fun)<jupyter_output><empty_output><jupyter_text>* Управляют внутренней работой объектов* Вызываются при использовании синтаксических конструкций* Вызываются встроенными (builtins) функциями* Рефлексия и метапрограммирование<jupyter_code>class TenItemList:
    
    def __len__(self):
        return 10
ten_item_list = TenItemList()
len(ten_item_list)<jupyter_output><empty_output><jupyter_text>Всё в Python является объектом, а все синтаксические конструкции сводятся к вызовам магическим методов<jupyter_code>vec = Vector2D()
vec.__getattribute__("x")
vec.x = 5
vec.__getattribute__("x")
vec.__setattr__("x", 10)
vec.x<jupyter_output><empty_output><jupyter_text>На самом деле все объекты реализованы как словари хранящие атрибуты объекта (однако есть возможности для оптимизаций)<jupyter_code>vec = Vector2D()
vec.__dict__
Vector2D.__dict__
vec.x = 5
vec.__dict__
class Foo:
    def __set<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10561497326203209, 'fraction_numerical': 0.013368983957219251, 'mean_word_length': 6.713917525773196, 'pattern_counts': {'":': 0, '<': 49, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '418461', 'license': 'MIT', 'n_tokens_mistral': 1268, 'n_tokens_neox': 1354, 'n_words': 232, 'path': 'files/general_overview/DataModel.ipynb', 'repo_name': 'mipt-npm-study/sciprog-python', 'size': '2992'}