Разница между @staticmethod и функцией внутри метода

#python #oop #methods #static-methods

Вопрос:

В чем заключаются различия или преимущества Circle1 и Circle2 ? Есть ли более правильный путь, чем другой? Единственное преимущество в том, что Circle2 я могу его унаследовать?

 class Geometry(object):
    def __init__(self, x, y):
        self.ptsx = x
        self.ptsy = y
        
        
class Circle1(Geometry):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        def circle_formula(radius):
            return 3.14*radius
        
        return circle_formula(self.radius)
    
    
class Circle2(Geometry):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return self.circle_formula(self.radius)   
    
    @staticmethod
    def circle_formula(radius):
            return 3.14*radius
 

Я знаю, что правильный способ состоял бы в том, чтобы функция @staticmethod of Cicle2 была такой же, как area_formula и при ее наследовании, перепишите ее. Но я сомневаюсь, что если мне действительно придется использовать вспомогательную функцию, которая будет жить только внутри определенного класса, каков наиболее правильный способ ее реализации?

Комментарии:

1. Привет, добро пожаловать в SO! Ваш вопрос основан на мнении, потому что технически оба метода хороши, и то, что вы спрашиваете, является вопросом личных предпочтений. Мы стараемся избегать вопросов, основанных на мнениях, на этой доске.

Ответ №1:

Основное различие между этими двумя классами заключается в том, что при добавлении staticmethod в метод вы можете получить доступ к этому методу без создания экземпляра класса.

Я имею в виду, я мог бы сделать: Circle2.circle_formula(2) .

В Circle1 вы должны создать экземпляр класса, чтобы получить доступ к методу вычисления площади;

 my_circle = Circle1(2)
my_circle.area()
 

Но в случае, который вы представляете, я бы добавил логику внутри метода area, поскольку реализован Circle1, без использования функции внутри него. Подобный этому:

 class Circle1(Geometry):
    def __init__(self, radius):
        self.radius = radius
    def area(self):        
        return 3.14*radius