'''Декорирование классов'''
'''Обычный декоратор'''
from functools import wraps
def header_h1(func):
@wraps(func)
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return f'
{result}
'
return inner
def header_h2(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return f'{result}'
return wrapper
@header_h2
def say_hello_to(name, surname):
return f'Hello {name} {surname}'
def test_1():
res = say_hello_to('Vasya', 'Ivanov')
print(f'{res=}')
'''Создание атрибутов в классе при помощи декоратора'''
'''
def custom_settings(cls):
cls.host = '127.0.0.1'
cls.port = 80
return cls
'''
def custom_settings(host='127.0.0.1', port=10):
def decorator(cls):
cls.host = host
cls.port = port
return cls
return decorator
@custom_settings(port=99)
class Settings:
pass
@custom_settings(host='10.32.2.43', port=19)
class Settings2:
pass
def test_2():
print(Settings.host, Settings.port)
print(Settings2.host, Settings2.port)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'''Создание методов в классе при помощи декоратора'''
def add_hello(cls):
cls.hello = lambda self: f'{self} say hello!'
return cls
@add_hello
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
def test_3():
p = Person('Ivan')
print(p.hello())
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def init_card_old(cls):
cls.total = 0
cls.type_card = 'debit'
return cls
@init_card_old
class BankAccount:
pass
def test_4():
print(BankAccount.total)
print(BankAccount.type_card)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def init_card(total=0, type_card='debit'):
def decorator(cls):
cls.total = total
cls.type_card = type_card
return cls
return decorator
@init_card(total=100, type_card='credit')
class BankAccount:
pass
@init_card(total=5005)
class TimeDeposit:
pass
def test_5():
print(TimeDeposit.total, TimeDeposit.type_card)
print(BankAccount.total, BankAccount.type_card)
def main():
# test_2()
# test_3()
# test_4()
test_5()
if __name__ == '__main__':
main()