В Python как использовать метод класса, не передавая ему экземпляр? - PullRequest
8 голосов
/ 30 марта 2012

Итак, у меня есть общий модуль, который содержит функции обработки чисел и типов данных, которые я использую. Я хочу иметь возможность включать его как from common import common (или еще лучше просто import common) и использовать такие функции, как common.howLongAgo(unixTimeStamp)

Что требуется для этого в моем общем модуле? Common - это модуль, состоящий из класса 'common'.

Ответы [ 3 ]

30 голосов
/ 30 марта 2012

Способы предоставления методов в модуле Python:

модуль foo.py:

def module_method():
    return "I am a module method"

class ModClass:
     @staticmethod
     def static_method():
         # the static method gets passed nothing
         return "I am a static method"
     @classmethod
     def class_method(cls):
         # the class method gets passed the class (in this case ModCLass)
         return "I am a class method"
     def instance_method(self):
         # An instance method gets passed the instance of ModClass
         return "I am an instance method"

сейчас, импорт:

>>> import foo
>>> foo.module_method()
'I am a module method'
>>> foo.ModClass.static_method()
'I am a static method'
>>> foo.ModClass.class_method()
'I am a class method'
>>> instance = ModClass()
>>> instance.instance_method()
'I am an instance method'

Если вы хотите сделать метод класса более полезным, импортируйте класс напрямую:

>>> from foo import ModClass
>>> ModClass.class_method()
'I am a class method'

Вы также можете import ... as ... сделать его более читабельным:

>>> from foo import ModClass as Foo
>>> Foo.class_method()
'I am a class method'

Какие из них вы должны использовать, это вопрос вкуса. Мое личное правило:

  • Простые служебные функции, которые обычно действуют на такие вещи, как коллекции, или выполняют некоторые вычисления или выбирают некоторый ресурс, должны быть модульными методами
  • Функции, связанные с классом, но не требующие ни класса, ни экземпляра, должны быть статическими методами
  • Функции, которые относятся к классу и нуждаются в классе для сравнения или для доступа к переменной класса, должны быть методами класса.
  • Функции, которые будут действовать на экземпляр, должны быть методом экземпляра.
2 голосов
/ 30 марта 2012

если у вас есть модуль common.py и функция находится в классе common

class common(object):
    def howLongAgo(self,timestamp):
          some_code

, то вы должны изменить свой метод на статический метод с декоратором @ staticmethod

class common(object):
    @staticmethod
    def howLongAgo(timestamp): # self goes out
          some_code

Таким образомвам не нужно менять весь класс, и вы все равно можете использовать self.howLongAgo в классе

0 голосов
/ 30 марта 2012
class Test(object):
    @classmethod
    def class_method(cls):
        return "class method"

test = Test()
print test.class_method()

[callen@odin scar]$ python ~/test.py
class method

Выше приведен стандартный способ выполнения методов класса с использованием современных объектов Python, а не классов старого стиля.

В качестве альтернативы вы можете иметь в виду статический метод:

class Test(object):
    @staticmethod
    def static_method():
        return "static method"

test = Test()
print test.static_method()
[callen@odin scar]$ python ~/test.py
static method

Используйте тот, который имеет больше смысла для вашей проблемы.Статические методы обычно должны быть разделены на их собственную независимую функциональность, использование класса там излишне.

Cf.http://pyvideo.org/video/880/stop-writing-classes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...