2013-02-15 3 views
0

Есть ли способ применить staticmethod ко всем методам данного класса.Любой способ применения staticmethod ко всем методам класса?

Я думал, что мы можем получить доступ к методам в своем метаклассе (в новых метакласса) и применить staticmethod, но я не знаю синтаксиса. Может ли кто-нибудь пролить свет на это?

ответ

2

Хотя a module (as suggested by mgilson) является лучшим вариантом, если вы действительно есть хорошо использовать для этого (я не могу думать об одном), это относительно легко с the inspect module и класс декоратора:

import inspect 

def staticmethods(cls): 
    for name, method in inspect.getmembers(cls, inspect.ismethod): 
     setattr(cls, name, staticmethod(method.__func__)) 
    return cls 

@staticmethods 
class Test: 
    def test(): 
     print("Test") 

Test.test() 

Все класс декоратора делает цикл с помощью методов на объекте с inspect.getmembers(), а затем переписывает функцию с staticmethod() исходной функции (несвязанного).

Обратите внимание, что я использовал бы модуль над классом для этого и, вероятно, также просто вручную вызывал @staticmethod для каждой функции, выполняя ее таким образом (так как это, например, прерывает проверки моего редактора). Этот ответ дается, чтобы показать, что это возможно, потому что это довольно простая реализация.

+0

Спасибо, это то, что я хочу – Neil

4

Если ни один из методов не разделяет какое-либо состояние, нет оснований для того, чтобы иметь класс вообще. модуль с функциями, вероятно, лучше ...

+0

+1, я как раз собирался это сказать. Класс с только статическими методами эквивалентен модулю и гораздо менее прост в реализации. –

+0

@ Lattyware - Да. Вы не можете подклассифицировать его, но на самом деле это не имеет никакого значения ... – mgilson

+0

Да, модуль с этими функциями лучше, но я группировал логически связанные функции в класс – Neil

1

mgilson's answer лучше, но добавить еще один образец, который часто используется для определения класса как пространство имен, можно также создать экземпляр класса, переписав имя класса:

class Test: 
    def a_static_method(self, arg1, srg2): 
     pass 

Test = Test() 

Имейте в виду, однако, что после этого Test на самом деле является экземпляром класса, который может вводить в заблуждение в зависимости от того, как вы его используете.

+1

Это коварно ... – mgilson

Смежные вопросы