pythonアクセサリーについて


1.関数装飾器
import time


def fucker0(m):
    print(m)

    def fucker(fuc):
        def fucker2(*args, **kwargs):
            st_time=time.time()
            s=fuc(*args, **kwargs)#      
            ed_time=time.time()
            print('       %s' %(ed_time-st_time))
            return s
        return fucker2
    return fucker


@fucker0('bitch') #     
def shit(a, b=None):
    if b is None:
        b = {}
    b.update({"name": 23, 'age': 46})
    a = a**2
    time.sleep(1)
    print('       %s,%s' % (a, b))
    return a, b


q=shit(3, b={7:8})
print(q)
#result
bitch
       9,{7: 8, 'name': 23, 'age': 46}
       1.003929615020752
(9, {7: 8, 'name': 23, 'age': 46})

アクセラレータは一度だけ実行するので、関数名の指すコードを永久に変更することに相当するので、関数ネストが必要である.類の装飾器装飾器は本質的に装飾対象、pythonの中ですべて対象である.次の例では、クラスにアトリビュートを追加するには、アクセラレータを使用します.
@staticmethod
def adding(self):   #        
    print('        ', self.b)


def Dec0(**kwargs):
    print('hahaha')
    def Dec(obj):
        for i in kwargs:
            # obj.i = kwargs[i]  #       ,  i     (key)
            # obj.__dict__[i] = kwargs[i]  #        
            setattr(obj, i, kwargs[i])
        return obj
    return Dec


@Dec0(x=3, a4=5, adding=adding)  #             !!!
class Test:
    name= 'sabi'   #            
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

t = Test(1,2,3)
t2 = Test(4,5,6)

print(t.a)
print(t.__dict__)
print(Test.x)
Test.adding(t2)
t.adding(t)

#result
hahaha
1
{'a': 1, 'b': 2, 'c': 3}
3
         5
         2

2.1類装飾器についてのいくつかの説明
The motivating use-case was to make certain constructs more easily expressed and less reliant on implementation details of the CPython interpreter. While it is possible to express class decorator-like functionality using metaclasses, the results are generally unpleasant and the implementation highly fragile [3]. In addition, metaclasses are inherited, whereas class decorators are not, making metaclasses unsuitable for some, single class-specific uses of class decorators. The fact that large-scale Python projects like Zope were going through these wild contortions to achieve something like class decorators won over the BDFLの鼓舞的な使用例は、いくつかの構造をより容易に表現し、CPython解釈器の実装の詳細に依存しないことである.メタ表現クラス装飾器クラス機能は使用できるが、結果は通常不快であり、非常に脆弱である.また、メタクラスは継承され、メタクラスはクラスの特定の用途に適していないため、メタクラスはクラスの特定の用途に適していない.実際にZopeのような大型Pythonプロジェクトはこれらの狂ったねじれを経験し、装飾器のようなものを実現してBDFLを獲得した.