Обзор ООП в python [1] здесь: Объектно-ориентированное программирование в Python
Это декораторы, которые являются частью аспектов функционального программирования в Python. О них читайте здесь: Функциональное программирование на Python [3]: @Decorators
Экземпляр, класс и статические атрибуты
Свойства могут быть переменными или методами
статический метод, метод класса и метод экземпляра
Если у нас есть много методов или свойств внутри класса объекта, некоторые из них могут просто потребоваться для промежуточных вычислений и не должны храниться в каком-либо объекте-экземпляре. Это временные переменные, к которым обращаются во время любых вычислений. Таким образом, мы могли бы определить их как переменные класса или методы класса, а не как свойства экземпляра или методы.
Характеристики:
- self должен быть первым аргументом для метода instance, а cls должен быть первым аргументом для метода class и статический метод не должен иметь никаких аргументов.
- статические и классовые методы могут быть вызваны без инициализации
- Статические методы и методы класса не могут вызывать методы или переменные экземпляра, но могут вызывать другие статические методы и методы или переменные класса.
- Статический метод принадлежит классу и вообще не будет использовать объект.
- Метод класса привязан не к объекту, а к классу.
метод класса и статический метод
Сходство: оба они могут вызываться в самом классе, а не только в экземпляре класса. Таким образом, оба они в некотором смысле являются методами класса.
Разница: метод класса получит сам класс в качестве первого аргумента, а статический метод — нет. Таким образом, staticmethod — это независимая функция, которая определена внутри класса, но не может получить доступ к методам и переменным класса как таковым, но их нужно отправить в функцию.
class A(object): x = 0 def say_hi(self): ''' Return a value that is a function of the instance with its attributes, and other arguments such as arg_1 and kwarg2 ''' pass @staticmethod def say_hi_static(): ''' Return a value that is a function of arg_0. It does not know the instance or class it is called from. ''' pass @classmethod def say_hi_class(cls): ''' Return a value that is a function of the class and other arguments. respects subclassing, it is called with the class it is called from. ''' pass def run_self(self): self.x += 1 print self.x # outputs 1 self.say_hi() self.say_hi_static() self.say_hi_class() @staticmethod def run_static(): print A.x # outputs 0 # A.say_hi() # wrong A.say_hi_static() A.say_hi_class() @classmethod def run_class(cls): print cls.x # outputs 0 # cls.say_hi() # wrong cls.say_hi_static() cls.say_hi_class()ob
Источники: