Post #200
324

- ❤ 11
- 👍 1
КО @it_success_path
Showing posts older than #201 · Back to latest

__str__ и __repr__. Они "отрабатывают" в момент отображения объекта и превращают технический мусор в красивую строку. В чем разница между ними?__str__ — для пользователей (когда вы делаете print() или str()).__repr__ — для разрабов (в режиме отладки или консоли).class Cat:
def __init__(self, name):
self.name = name
def __repr__(self):
return f'{self.__class__}: {self.name}'
def __str__(self):
return f'Имя кошки: {self.name}'
cat = Cat('Василий')
cat # в консоле выведет: <class '__main__.Cat'>: Василий
print(cat) # Имя кошки: Василий
str(cat) # Имя кошки: Василий
__len__, __abs__. class Point:
def __init__(self, *args):
self.__coords = args
def __len__(self):
return len(self.__coords)
def __abs__(self):
return list(map(abs, self.__coords))
p = Point(1, -2)
print(len(p)) # 2
print(abs(p)) # [1, 2]
Верно решили 3 114 учащихся
Из всех попыток 22% верных
def __set_name__(self, owner, name): # а это что еще за зверь?!
self.name = '__' + name # 1 способ - не подошел (хотя так показывали в теории)
self.name = f'_{owner.__name__}__{name}' # 2 cпособ(верный в моем случае)
_ObjList__next, но дескриптор создал атрибут с именем __next. Python считает эти два имени абсолютно разными. Выходит обращался не по тому "адресу".class Counter:
def __init__(self):
self.__counter = 0
def __call__(self, *args, **kwargs):
print('__call__')
self.__counter += 1
return self.__counter
c = Counter()
c()
c()
res = c()
print(res) # 3 🎯
class Counter:
def __init__(self):
self.__counter = 0
def __call__(self, step=1, *args, **kwargs):
print('__call__')
self.__counter += step
return self.__counter
c = Counter()
c2 = Counter()
c()
c(10)
res = c(3)
res2 = c2(-5)
print(res, res2) # что выведет? 🧠
class StripChars:
def __init__(self, chars):
# символы для удаления в конце и начале строки
self.__chars = chars
def __call__(self, *args, **kwargs):
if not isinstance(args[0], str):
raise ValueError("Аргумент должен быть строкой")
return args[0].strip(self.__chars)
s1 = StripChars("?:!.; ")
res = s1("; Hello World! ")
print(res) # "Hello World" ✨
import math
class Derivate:
def __init__(self, func):
self.__fn = func
def __call__(self, x, dx=0.0001, *args, **kwargs):
return (self.__fn(x + dx) - self.__fn(x)) / dx
@Derivate
def df_sin(x):
return math.sin(x)
# df_sin = Derivate(df_sin) # в "лоб"
print(df_sin(math.pi/3)) # производная синуса 🧮



class Point3D:
def __init__(self, x, y, z):
self._x = x
self._y = y
self._z = z
@staticmethod
def verify_coord(coord):
if type(coord) != int:
raise TypeError('Координата должна быть целым числом')
@property
def x(self):
return self._x
@x.setter
def x(self, coord):
self.verify_coord(coord)
self._x = coord
# и так еще 2 раза для y, z... а если их больше будет?!
class Integer:
@staticmethod
def verify_coord(coord):
if type(coord) != int:
raise TypeError('Координата должна быть целым числом')
def __set_name__(self, owner, name): # а это что еще за зверь?!
self.name = '_' + name
# еще один вариант установки имени, как в property, аналог
# self.__name = f'_{owner.__name__}__{name}'
def __get__(self, instance, owner): # геттер
return getattr(instance, self.name)
# return instance.__dict__[self.name] # другой способ для примера
def __set__(self, instance, value): # сеттер
self.verify_coord(value)
setattr(instance, self.name, value)
# instance.__dict__[self.name] = value # другой способ для примера
class Point3D:
x = Integer()
y = Integer()
z = Integer()
def __init__(self, x, y ,z):
self.x = x
self.y = y
self.z = z

class Person:
def __init__(self, name, old):
self.__name = name
self.__old = old
def get_old(self):
return self.__old
def set_old(self, old):
self.__old = old
old = property(get_old, set_old) .
class Person:
def __init__(self, name, old):
self.__name = name
self.__old = old
@property
def old(self):
return self.__old
@old.setter
def old(self, old):
self.__old = old
@old.deleter
def old(self):
del self.__old
t = (int, str, str, float, int)
book = [t[i](x) if t[i] != str else x.strip() for i, x in enumerate(input().split(","))]


attribute (без подчёркиваний) - публичное свойство (public)_attribute (с одним подчёркиванием) - protected (внутри класса и дочерних классов) __attribute (с двумя подчёркиваниями) - private (только внутри класса)u = User(27)u._User__ageset_age(self, age) - изменить значение возрастаget_age(self) - вернуть значение возраста