class MyClass:
def method(self):
return 'instance method called', self
@classmethod
def classmethod(cls):
return 'class method called', cls
@staticmethod
def staticmethod():
return 'static method called'
=================
Методы экземпляра
=================
Первый метод в MyClass, названный method, является обычным методом экземпляра. Это основной тип метода без излишеств, который вы будете использовать большую часть времени. Вы можете видеть, что метод принимает один параметр, self, который указывает на экземпляр MyClass при вызове метода (но, конечно, методы экземпляра могут принимать более одного параметра).Через параметр self методы экземпляра могут свободно обращаться к атрибутам и другим методам того же объекта. Это дает им большие возможности, когда дело доходит до изменения состояния объекта.Мало того, что они могут изменять состояние объекта, методы экземпляра также могут получить доступ к самому классу через атрибут self.__class__. Это означает, что методы экземпляра также могут изменять состояние класса.
Детально смотри https://informatics-ege.blogspot.com/2022/07/instance-method-in-python.html
==============
Методы класса
==============
Давайте сравним это со вторым методом MyClass.classmethod. Этот метод помечен декоратором @classmethod, чтобы пометить его как метод класса.Вместо того чтобы принимать параметр self, методы класса принимают параметр cls, указывающий на класс, а не на экземпляр объекта, при вызове метода.Поскольку метод класса имеет доступ только к этому аргументу cls, он не может изменять состояние экземпляра объекта. Для этого потребуется доступ к self. Однако методы класса по-прежнему могут изменять состояние класса, которое применяется ко всем экземплярам класса.
==================
Статические методы
==================
Третий метод, MyClass.staticmethod, был помечен декоратором @staticmethod, чтобы пометить его как статический метод. Этот тип метода не принимает ни параметров self, ни cls (но, конечно, он может принимать произвольное количество других параметров). Поэтому статический метод не может ни изменять состояние объекта, ни состояние класса. Статические методы ограничены в том, к каким данным они могут получить доступ, и в первую очередь они представляют собой способ пространства имен ваших методов.
===============
Итальянцы придумали свою таксономию пиццы много веков назад, поэтому все эти восхитительные виды пиццы имеют свои собственные названия. Было бы неплохо воспользоваться этим и предоставить пользователям нашего класса Pizza улучшенный интерфейс для создания объектов пиццы, которые они хотят. Хороший и чистый способ сделать это — использовать методы класса в качестве фабричных функций для различных видов пиццы, которые мы можем создать:
boris@boris-All-Series:~/PIZZA$ cat pizzaMethod.py
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
def __repr__(self):
return f'Pizza({self.ingredients!r})'
@classmethod
def margherita(cls):
return cls(['mozzarella', 'tomatoes'])
@classmethod
def prosciutto(cls):
return cls(['mozzarella', 'tomatoes', 'ham'])
print(Pizza.margherita())
print(Pizza.prosciutto())
boris@boris-All-Series:~/PIZZA$ python3 pizzaMethod.py
Pizza(['mozzarella', 'tomatoes'])
Pizza(['mozzarella', 'tomatoes', 'ham'])
Статические методы не могут получить доступ к состоянию класса или экземпляра, потому что они не принимают аргумент cls или self. Это большое ограничение, но это также отличный сигнал, чтобы показать, что конкретный метод независим от всего остального вокруг него. В приведенном ниже примере ясно, что circle_area() не может каким-либо образом изменить класс или экземпляр класса. Вы всегда можете обойти это с помощью глобальной переменной,но здесь речь не об этом. Пометка метода как статического - это не просто намек на то, что метод не будет изменять состояние класса или экземпляра - это ограничение также накладывается средой выполнения Python. Подобные методы позволяют вам четко сообщать о частях архитектуры вашего класса, чтобы новая работа по разработке естественным образом направлялась в рамках этих установленных границ. Конечно, было бы достаточно легко бросить вызов этим ограничениям. Но на практике они часто помогают избежать случайных модификаций, идущих вразрез с исходным замыслом.
boris@boris-All-Series:~/PIZZA$ cat pizzaStatistic.py
import math
class Pizza:
def __init__(self, radius, ingredients):
self.radius = radius
self.ingredients = ingredients
def __repr__(self):
return (f'Pizza({self.radius!r}, '
f'{self.ingredients!r})')
def area(self):
return self.circle_area(self.radius)
@staticmethod
def circle_area(r):
return r ** 2 * math.pi
p = Pizza(4, ['mozzarella', 'tomatoes'])
print(p)
print( p.area())
print( Pizza.circle_area(4))
boris@boris-All-Series:~/PIZZA$ python3 pizzaStatistic.py
Pizza(4, ['mozzarella', 'tomatoes'])
50.26548245743669
50.26548245743669
No comments:
Post a Comment