簡體   English   中英

如何在 Python 中獲取類的類方法的所有名稱

[英]How to get all names of a classes' classmethods in Python

我想通過代碼反射找出下面類Something所有類方法。 對於所有類方法,我的意思是所有用@classmethod 我實際上不知道這是否相同。

class Something:
    @classmethod
    def a(cls):
        print('a')

    @staticmethod
    def b(cls):
        print('b')

    def c(self):
        print('c')

所以在這種情況下,我希望得到一個只包含'a'的列表:

get_classmethod_names(Something) == ['a']

這可以像遍歷 classes 屬性並檢查classmethod對象一樣簡單:

In [1]: class Something:
   ...:     @classmethod
   ...:     def a(cls):
   ...:         print('a')
   ...:
   ...:     @staticmethod
   ...:     def b(cls):
   ...:         print('b')
   ...:
   ...:     def c(self):
   ...:         print('c')
   ...:

In [2]: [attr for attr, obj in vars(Something).items() if isinstance(obj, classmethod)]
Out[2]: ['a']

請注意,如果您關心繼承的類方法,那么您必須為類的方法解析順序中的每個類檢查它,因此:

In [3]: class BaseSomething:
   ...:     @classmethod
   ...:     def u(cls):
   ...:         print('u')
   ...:
   ...: class Something(BaseSomething):
   ...:     @classmethod
   ...:     def a(cls):
   ...:         print('a')
   ...:
   ...:     @staticmethod
   ...:     def b(cls):
   ...:         print('b')
   ...:
   ...:     def c(self):
   ...:         print('c')
   ...:

In [4]: Something.mro()
Out[4]: [__main__.Something, __main__.BaseSomething, object]

In [5]: [
   ...:     attr
   ...:     for cls in Something.mro()
   ...:     for attr, obj in vars(cls).items()
   ...:     if isinstance(obj, classmethod)
   ...: ]
Out[5]: ['a', 'u']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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