2014-12-10 2 views
0

Есть ли разница в двух способах вызова статического метода в том же классе, который показан ниже?Разница между различными способами вызова статического метода из класса

class MyClass: 

    def __init__(self): 
    self.do_something() #or MyClass.do_something()? 

    @staticmethod 
    def do_something(): 
    pass 

Более конкретно, особенно в тех случаях, рефакторинга (изменение имени класса) и наследования (как статические методы могут быть унаследованы и переопределить в Python)?

+0

В java (сильное) соглашение заключается в том, чтобы избежать использования «этого» в статическом контексте. Конечно, статические методы настолько редки в python (функции на уровне модуля лучше всего в большинстве случаев), так что на самом деле это нормально. – roippi

+1

@MartijnPieters: извините, но он * делает * вопрос, cf ответ jonrsharpe. –

+0

Я проголосовал за повторное открытие, понимая, что вопрос был немного меньшим, чем фрагмент заголовка и первого предложения, но может ли он быть переписан, чтобы вместо этого изменить угол различия? –

ответ

6

Я могу думать только об одной ситуации, в которой это могло бы иметь значение; как насчет того, когда вы наследуете от MyClass? Сравните:

>>> class MyClass(object): 
    def __init__(self): 
     self.do_something() 
    @staticmethod 
    def do_something(): 
     print "Base class" 


>>> class SubClass(MyClass): 
    @staticmethod 
    def do_something(): 
     print "Sub class" 


>>> s = SubClass() 
Sub class 

с:

>>> class MyClass(object): 
    def __init__(self): 
     MyClass.do_something() 
    @staticmethod 
    def do_something(): 
     print "Base class" 


>>> class SubClass(MyClass): 
    @staticmethod 
    def do_something(): 
     print "Sub class" 


>>> s = SubClass() 
Base class 

Это надуманный пример, но вы должны рассмотреть то, что вы думаете, что соответствующее поведение должно быть.


Ваш пример рефакторинга для изменения имени класса также является хорошим; self не нужно обновлять каждый раз, когда вы переименовываете класс, тогда как если у вас есть явные ссылки MyClass, вы должны их обновить (хорошая IDE сделает это за вас, но если вы можете избежать этого, то лучше).

+1

Я не знал, что статические методы были унаследованы в python. Тогда на самом деле есть разница, отличная от семантической. Спасибо за пример. – Godsmith

Смежные вопросы