Professional Documents
Culture Documents
Proba
Proba
Proba
def verify_coord(cls,n):
if n != '__x' and n != '__y':
raise AttributeError("���������� : 'x', 'y'")
==============================================================================
print('\n')
print('------------------------------------------- Point')
print('\n')
class Point:
__slots__ = ['__a', '__b', '__c', '__d', '__dict__']
def __del__(self):
print( "�������� ��������� "+ str(self))
@staticmethod
def change(*args):
#print(f"len(args) = {len(args)}")
a,b = args
x1,y1 = a
x2,y2 = b
a = x1,y2
b = x2,y1
return a,b
def get_point(self):
print( self.__a, self.__b, self.__c, self.__d)
def set_point(self, a, c):
self.__a = a
self.__c = c
self.__b,self.__d = self.change(a,c)
pt = Point((1,4),(6,1))
print(pt.__dict__)
#print(__a) # NameError: name '__a' is not defined
#print(a) # NameError: name '__a' is not defined
#print(pt.a) # AttributeError: 'Point' object has no attribute 'a'
#print(pt.__a) # AttributeError: 'Point' object has no attribute '__a'
pt.get_point()
pt.set_point((1,5),(6,2))
pt.get_point()
print(pt.__dict__)
#pt.e = 7,8 # AttributeError: ���������� : '__a', '__b', '__c', '__d'
#print(pt.__dir__())
#res = Point.change((2,5),(7,2))
#print(f"res = {res}")
==============================================================================
print('\n')
print('------------------------------------------- Point2D')
print('\n')
class Point2D:
def __del__(self):
print( "�������� ��������� "+ str(self))
def get_point(self):
print( self.x, self.y)
p = Point2D()
print(p.__dict__) # {'x': 0, 'y': 0}
p.x = 1
p.y = 4
print(p.__dict__) # {'x': 1, 'y': 4}
p.get_point() # 1 4
#p.z = 7 # AttributeError: ���������� : 'x' or 'y'
p = 0 # �������� ��������� <__main__.Point2D object at 0x02C86238>
def switch_name(self,argument):
print("switch_name switch_name switch_name")
switcher = {
'a': True,
'b': True,
'c': True,
'd': True,
}
return (switcher.get(argument, False))
name = switch_name(arg)
print(f"name = {name}")
element = switch_element(arg,self.CORRECT)
print(f"element = {element}")
==============================================================================
==============================================================================
������ 1
�������� property. ��������� @property
class Point:
def get_coord(self):
print("����� __get_coord")
return self.__x, self.__y
def del_coord(self):
del self.__x
del self.__y
������������� �����:
������� �� �������� � ��������
�������-�������� property
class Point:
def __get_coord(self):
print("����� __get_coord")
return self.__x, self.__y
def __del_coord(self):
del self.__x
del self.__y
������������� �����:
���������� ��������� @property
class Point:
@property
def coord(self):
print("����� __get_coord")
return self.__x, self.__y
@coord.deleter
def coord(self):
del self.__x
del self.__y
==============================================================================
������ 2
�������� property. ��������� @property
������:
���������� ������� ������������ ������ �����������
���
������� (����� ����� �� 14 �� 20)
���� � ����� �������� � �������: ���� ������ (������ �����, ������, ����� �����),
��� � - ����� �� 0 �� 9
���, � �� (������������ ����� �� 20 � ����)
class Person:
S_RUS = '�������������������������������-'
S_RUS_UPPER = S_RUS.upper()
self.__fio = fio.split()
self.old = old
self.passport = ps
self.weight = weight
# ��������: old
# �������� ��� ��� ����� ����� int
# �������� ���������� ��������
@classmethod
def verify_old(self,old):
# ��������: old
# �������� ��� ��� ����� ����� int
# �������� ���������� ��������
# if type(old) != int or 14 > old or old > 120:
if type(old) != int or not 14 < old < 120:
raise TypeError("������� ������ ���� ����� ������ � ���������
[14:120]")
# ��������: weight
# ���������� ��������
@classmethod
def verify_weight(self,w):
if type(w) != float or not 20 < w < 120:
raise TypeError("��� ������ ���� ������������ ������ � ���������
[20:120]")
# ��������: ps
# �������� ���������� ������
# �������� ��� ��� ������
# if type(ps) != str:
# ���� ��� = ���������� ������
# ���� ��� ������
# ������� �� �� ������ �� ���� ��������� ����������� ��������
# s = ps.split()
# ���� ������ �� ����� 2
# � ������ ������� ������ �� ����� 4
# � ������ ������� ������ �� ����� 6
# ���������� ������
# �������� � ������ ����� for ��� �� ��� �����
# if not p.isdigit():
# ���� ����� isdigit() ����� ���������� False
# �� ������ � ������ ���� �� �������� �������
# ���������� ������
#
#
#
@classmethod
def verify_ps(self,ps):
if type(ps) != str:
raise TypeError("������� ������ ���� �������")
s = ps.split()
if len(s) != 2 or len(s[0])!= 4 or len(s[1])!= 6:
raise TypeError("�������� ������ ������ ��������")
for p in s:
if not p.isdigit():
raise TypeError("���� � ����� �������� ������ ���� �������")
#
# ����� ���� ����� �������������� __init__
#
# def __init__(self, fio, old, ps, weight):
# self.verify_fio(fio)
# self.verify_old(old)
# self.verify_weight(weight)
# self.verify_ps(ps)
#
# self.__fio = fio.split()
# self.__old = old
# self.__passport = ps
# self.__weight = weight
#
# ������ ���� ��������
# ����� ���� �������������� ���������-����������
# � ������� � ����������� ��������
# �� ���������� ������ � ������� ��������� �������� ��������
# self.__old = old
# � ����� ��������� ����� self ������-�������� � ��������� ��������
# self.old = old
# ����� fio ��� ��� �� �������� ������
# � ����������
# def __init__(self, fio, old, ps, weight):
# self.verify_fio(fio)
#
# self.__fio = fio.split()
# self.old = old
# self.passport = ps
# self.weight = weight
#
#
==============================================================================
==============================================================================
������ 3
�������� property. ��������� @property
class BankAccount:
def get_balance(self):
print('get_balance')
return self.__balance
def set_balance(self,value):
print('set_balance')
if not isinstance(value,(int,float)):
raise ValueError('�������� ������� ������ ���� �����')
self.__balance = value
def delete_balance(self):
print('delete_balance')
del self.__balance
������������� �����:
�� ����� �������� ������� ������� ����� ����� � ����� ������-��������
�� �������� ����������� ��������� ��������� @property
������ �������� �� ��������� ����� ����� ������ ����� ������-�������� balance
ac.balance = 400000 ���������� ��������
print(ac.balance) �������� ��������
del ac.balance ������� ��������
class BankAccount:
@property
def balance(self):
print('get_balance')
return self.__balance
@balance.setter
def balance(self,value):
print('set_balance')
if not isinstance(value,(int,float)):
raise ValueError('�������� ������� ������ ���� �����')
self.__balance = value
@balance.deleter
def balance(self):
print('delete_balance')
del self.__balance
==============================================================================
==============================================================================
������ 4
�������� property. ��������� @property
���������� property
���� ����� Square, ������ ��� ������������� ��������� �������� ����� �� ������
�������� Z
� ����� ������ �������� ������� ��������: area = Z**2 (������� �� 2 �������)
class Square:
@property
def area(self):
return self.side**2
������������� �����:
�������� �������� ��������� __area = None
� �������� �������� �������� ������� ���� ����������
� ���� ��� (��������) �� ���������� - ���������� ������
class Square:
@property
def area(self):
if self.__area is None:
print('Calculate area')
self.__area = self.side**2
return self.__area
c = Square(7)
print(c.area) # 49 Calculate area ��������� ���������
print(c.area) # 49 ����������� ���������� ��������
# �� ��� ��������� ����� ��������:
# ��� ��������� ������� �������
# ����������� ��������� ���������
# � �� ������������ � �������� ��������
c.side = 9
print(c.area) # 49 ����������� ���������� ��������
# ��������� ���������� � side = 7
# � �� ����������� ����� � side = 9
������������� �����:
���������� ��� ������� (��������� ������� ������� = ��������� ������� �������)
�� ����� �������� ���������� self.__area ���������� ���������� � None
� ���������� � ��������� self.side ������� ��� ������ property
� �� ����� ������� ��������� ��������� self.__side
������� ������-������� @property � ��������� side (������ � ������)
class Square:
@property
def side(self):
return self.__side
@side.setter
def side(self,value):
self.__side = value
self.__area = None
@property
def area(self):
if self.__area is None:
print('Calculate area')
self.__area = self.side**2
return self.__area
c = Square(7)
print(c.area) # 49 Calculate area ��������� ���������
print(c.area) # 49 ����������� ���������� ��������
c.side = 9
print(c.area) # 81 Calculate area ��������� ���������
==============================================================================
==============================================================================
������ 4
���������� � Python
def fib(x):
return fib(x-1) + fib(x-2) if x > 1 else x
print(fib(10)) # 55
print(fib(35)) # 9227465 �������� ����� �����, ���� �� ������ ����� (�� ����������
������)
def mydec(func):
def wrapper(x):
return func(x) * 10
return wrapper
@mydec
def fib(x):
return fib(x-1) + fib(x-2) if x > 1 else x
print(fib(10)) # 20305000000
def mydec(func):
def wrapper(*args, **kwargs):
return func(*args, *kwargs) * 10
return wrapper
@mydec
def fib(x):
return fib(x-1) + fib(x-2) if x > 1 else x
��������������� ��������� :
����� ������� ����������� ���������� � ������� cache = {}
����� ����� ����������� � ������ *args, **kwargs (������ �� �������)
(� ���������� ��� ������ �� ����� - ��������� ������)
key = str(args) + str(kwargs)
������ ���� ������ ���� key ��� � ������� cache if key not in cache:
�� ������� �������� ����
cache[key] = func(*args, *kwargs) * 10 � ���������� ��������� return
cache[key]
���� ���� �� ������ ���������� ��������� return
cache[key]
def mydec(func):
cache = {}
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key not in cache:
cache[key] = func(*args, *kwargs) * 10
return cache[key]
wrapper.__doc__ = func.__doc__
wrapper.__name__ = func.__name__
return wrapper
@mydec
def fib(x):
""" �������� ������ """
return fib(x-1) + fib(x-2) if x > 1 else x
print(fib(10)) # 20305000000
@wraps(func)
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key not in cache:
cache[key] = func(*args, *kwargs) * 10
return cache[key]
return wrapper
@mydec
def fib(x):
""" �������� ������ """
return fib(x-1) + fib(x-2) if x > 1 else x
print(fib(10)) # 20305000000
���������-������
��������� � ����������� �����������
@mydec - ��� ��������� (������ ����� ��������� ����� ������ � ���������� ������)
�� ��� ������ �� �������� ������� ������ @mydec(10) - ��� ��� ����� �������
� ������ ��� ������ ������� ��� :
� ��� ���� ������, ������ �� ������� � ��� ���-�� �������
� �� ��� ��� ������� � ����� ����������� ������� ���� ��������� � ����� ����
������ @mydec(n) ��� ������ ������ ���������� ��������� return decorator
� �� ��� ������ ���� � def mydec ����������� � ������ def decorator(func)
������ � ��������� ���� ����
def mydec(n):
def decorator(func):
cache = {}
@wraps(func)
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key not in cache:
cache[key] = func(*args, *kwargs) * n
return cache[key]
return wrapper
return decorator
@mydec(10)
def fib(x):
""" �������� ������ """
return fib(x-1) + fib(x-2) if x > 1 else x
print(fib(10)) # 20305000000
���������-�����
��������� ����� ���� � �������
� ������ @Counter
���������� ������������ ������ � ������� ������ ������ Counter
� ����������� ������ def __init__(self, func) �������� ���� ����������� ����
(func -������ ��������)
� ���������� � ������� �������� ������ self.__func = func
����� ��������� �������� ����� ���� ( �����������, ��....) �� ������������
@wraps(func)
��� ���������� �������� ���� �� wrapper
������ ��� ����� ����������� �������� ���� � ������ ������, �.�. � self
(��� �������� ������� ���� ������ ����� ���������� ������� ������)
�� ����� ����� ������������ update_wrapper from functools import
lru_cache, wraps
update_wrapper(sefl, wrapped=func) sefl - ���� ����������
wrapped=func - ������ ����������
�� ��� � ��� ���� �������� ������ ������ ������ � ����� �������� ������ � ���
���������: � cnt
from functools import update_wrapper
class Counter:
cnt = 0
def __init__(self, func):
update_wrapper(self, wrapped=func)
self.__func = func
@Counter
def fib(x):
""" �������� ������ """
return fib(x-1) + fib(x-2) if x > 1 else x
print(fib(10)) # 55
print(fib.cnt) # 177
class Counter:
cnt = 0
def __init__(self, func):
update_wrapper(self, wrapped=func)
self.__func = func
@Counter
@lru_cache
def fib(x):
""" �������� ������ """
return fib(x-1) + fib(x-2) if x > 1 else x
print(fib.cnt) # 199
==============================================================================
==============================================================================
�����������
����������� ������� � ����������
��� �������� ������ ����������� ���������
��� ���������, ��������� ��� ��������� ��������
class B:
def __get__(self, obj, objtype=None):
print('__get__ b')
return obj.__dict__['_b']
def __set__ (self, obj, val):
print('__set__ b')
obj.__dict__['_b'] = val
class X:
a = 1
b = B() # ���
def __init__(self):
self.b = 5
class B:
def __get__(self, obj, objtype=None):
print('__get__ b')
return obj.__dict__['_b']
def __set__ (self, obj, val):
print('__set__ b')
obj.__dict__['_b'] = val
class X:
a = 1
b = B() # ���
@property
def c(self):
print('__get__ c')
return self._c
@c.setter
def c(self,val):
print('__set__ c')
self._c = val
def __init__(self):
self.b = 5
self.c = 7
class B:
def __set_name__(self, obj, name):
print(f'__set_name__ : {name}')
self.name = '_'+ name
class X:
a = 1
b = B() # ���
c = B()
def __init__(self):
self.b = 5
self.c = 7
x = X()
print(x.a) # 1
print(x.b) # <__main__.B object at 0x02BFB1C0> ������ �� ������ ������ B
print(x.c)
print(x.__dict__) # {} ������� ������� x
print(X.__dict__)
class B:
def __init__(self, minv, maxv):
self.minv = minv
self.maxv = maxv
class X:
a = 1
b = B(4,7) # ���
c = B(7,9)
return super().__getattribute__(name)
def __init__(self):
self.b = 5
self.c = 7
x = X()
x.e = 3
print(x.a) # 1
print(x.b) # <__main__.B object at 0x02BFB1C0> ������ �� ������ ������ B
print(x.c)
print(x.__dict__) # {} ������� ������� x
print(X.__dict__)
print(x.f)
���������� ���������
0. __getattribute__
���� ���������� �������� ������� ���������� ������ �� �������� (�������� ���������
����� property ���� �� �������)
���� ��� ����� �� ������� �������� ������� ���������
������ ���������
������ ���������
2. __dict__
���� �������� � �������
���� ������ �������� ���
3. ��������
���� �������� ������ ������� ������ �� ������������
��� ���������� ��� ������ non-data descriptor
���� ������ �������� ���