При интеграции приложения Django, которое я раньше не использовал, я обнаружил два разных способа определения функций в классах. Автор, кажется, намеренно использует их оба. Первым я сам часто пользуюсь:
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
Другой - тот, которым я не пользуюсь, в основном потому, что не понимаю, когда его использовать и для чего:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
В документации Python classmethod
декоратор объясняется следующим предложением:
Метод класса получает класс как неявный первый аргумент, точно так же, как метод экземпляра получает экземпляр.
Так что, я полагаю, cls
относится к Dummy
себе (к class
, а не к экземпляру). Я не совсем понимаю, почему это существует, потому что я всегда мог это сделать:
type(self).do_something_with_the_class
Это просто для ясности, или я пропустил самую важную часть: жуткие и захватывающие вещи, которые невозможно было бы сделать без этого?
self.foo()
положеноBar.foo()
.self.foo()
предпочтительнее, потому чтоself
может быть экземпляром подкласса, который реализует свой собственныйfoo
.Bar
, поскольку1+1 == 2 == 1*2
, поэтому по показанным результатам невозможно определить, чтоBar().static_method
действительно вызывается.По сути, вы должны использовать @classmethod, когда понимаете, что определение метода не будет изменено или отменено.
Дополнительно: теоретически методы класса быстрее, чем методы объекта, потому что не требуют создания экземпляров и требуют меньше памяти.
источник
Если вы добавите декоратор @classmethod, это означает, что вы собираетесь сделать этот метод статическим методом java или C ++. (статический метод - это общий термин, я думаю ;) ) Python также имеет @staticmethod. и разница между classmethod и staticmethod заключается в том, можете ли вы получить доступ к классу или статической переменной с помощью аргумента или самого имени класса.
class TestMethod(object): cls_var = 1 @classmethod def class_method(cls): cls.cls_var += 1 print cls.cls_var @staticmethod def static_method(): TestMethod.cls_var += 1 print TestMethod.cls_var #call each method from class itself. TestMethod.class_method() TestMethod.static_method() #construct instances testMethodInst1 = TestMethod() testMethodInst2 = TestMethod() #call each method from instances testMethodInst1.class_method() testMethodInst2.static_method()
все эти классы увеличивают cls.cls_var на 1 и распечатывают его.
И все классы, использующие одно и то же имя в той же области видимости или экземпляры, созданные с помощью этого класса, будут использовать эти методы. Есть только один TestMethod.cls_var и еще один TestMethod.class_method (), TestMethod.static_method ()
И важный вопрос. зачем нужен этот метод.
classmethod или staticmethod полезны, когда вы делаете этот класс фабрикой или когда вам нужно инициализировать свой класс только один раз. например, открыть файл один раз и использовать метод подачи для чтения файла построчно.
источник