在下面显示的同一个类中调用静态方法的两种方法有区别吗?
class MyClass:
def __init__(self):
self.do_something() #or MyClass.do_something()?
@staticmethod
def do_something():
pass
更具体地说,特别是在重构(更改类名)和继承的情况下(因为静态方法可以在Python中继承和覆盖)?
答案 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会为您执行此操作,但是如果您可以避免那更好)。