pythonアクセサリーについて
12509 ワード
1.関数装飾器
アクセラレータは一度だけ実行するので、関数名の指すコードを永久に変更することに相当するので、関数ネストが必要である.類の装飾器装飾器は本質的に装飾対象、pythonの中ですべて対象である.次の例では、クラスにアトリビュートを追加するには、アクセラレータを使用します.
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を獲得した.
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を獲得した.