[英]Save all class methods with decorator
我有一個類,並且我希望所有類的方法都在該類內的列表中,即使我有兩個同名的方法,我也希望它能工作,但我的問題是我無法訪問該類以將方法放在那里。 可以說我有裝飾師
def dec(func):
class = ????
class.methods.append(func)
return func
我有課
class A(object):
methods = []
@dec
def a(self):
print 2
@dec
def a(self):
print 3
我想能夠做
A.methods[0](A())
A.methods[1](A())
(A() becuase those methods need self)
或類似的東西
我已經讀過很多這樣的問題,並且看起來好像不是我真正想要的,因為在調用裝飾器時A不存在,但是也許有一種方法可以訪問它的變量,因為裝飾器在其中運行?
類對象本身僅在 body語句( class <classname>(<bases,>):
塊內的所有語句均已執行class <classname>(<bases,>):
之后構造,另一方面,裝飾器與它們要修飾的函數一起執行。
您可以在想要將方法添加到裝飾器的列表中:
class A(object):
methods = []
@dec(methods)
def a(self):
print 2
@dec(methods)
def a(self):
print 3
並讓裝飾器使用該列表來追加您的方法:
def dec(methodslist):
def decorator(f):
methodslist.append(f)
return f
return decorator
如果您使用的是Python 3,則另一個選擇是讓您使用帶有自定義metaclass.__prepare__
類方法使用collections.defaultdict()
首先將所有屬性收集到列表中,因此即使命名相同,也仍然可以訪問它們。 然后,您的裝飾器只需用額外的屬性或其他東西“標記”每個功能對象。 這涉及更多。
然后,當您要調用這些函數時,很正確的一點是它們沒有綁定,也不會為您傳遞self
。 手動傳遞self
或手動綁定 。 函數是描述符對象 ,調用它們的__get__
方法將它們綁定到實例:
for func in self.methods:
method = func.__get__(self)
method()
演示:
>>> def dec(methodslist):
... def decorator(f):
... methodslist.append(f)
... return f
... return decorator
...
>>> class A(object):
... methods = []
... @dec(methods)
... def a(self):
... print 2
... @dec(methods)
... def a(self):
... print 3
... def call_all(self):
... for func in self.methods:
... method = func.__get__(self)
... method()
...
>>> A().call_all()
2
3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.