|
@@ -0,0 +1,121 @@
|
|
|
+'''Декорирование классов'''
|
|
|
+
|
|
|
+'''Обычный декоратор'''
|
|
|
+from functools import wraps
|
|
|
+
|
|
|
+def header_h1(func):
|
|
|
+ @wraps(func)
|
|
|
+ def inner(*args, **kwargs):
|
|
|
+ result = func(*args, **kwargs)
|
|
|
+ return f'<h1>{result}</h1>'
|
|
|
+ return inner
|
|
|
+
|
|
|
+def header_h2(func):
|
|
|
+ def wrapper(*args, **kwargs):
|
|
|
+ result = func(*args, **kwargs)
|
|
|
+ return f'<h2>{result}<h2>'
|
|
|
+ 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()
|