簡體   English   中英

使用裝飾器保存所有類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM