假设我有两个类
A
和B
,其中B
继承自A
。 A
和 B
都有一个 bar
方法。 A
有一个 foo
方法,该方法由 B
继承。
我现在希望每当调用
bar
时都调用 A
中的 foo
,无论对象是 B
还是 A
的实例。
我用谷歌搜索,发现我可能应该使用
@staticmethod
。这样的事情正确吗?还是编程错误或某种逻辑错误?
class A:
def foo(self):
self.bar()
A.bar_static()
def bar(self):
print('Iam A')
@staticmethod
def bar_static():
print('Iam A')
class B(A):
def bar(self):
print('Iam B')
@staticmethod
def bar_static():
print('Iam B')
输出(这就是我想要的):
b = B()
b.foo()
Iam B
Iam A
编辑: 一个可能的应用是通过
prop
函数计算(热力学)属性。 prop
需要调用prop_aux
来计算东西。 prop
和prop_aux
由A
和B
实现,它们是不同的模型(B
是A
的扩展,因此继承自A
)。现在,B
的prop
实现调用B
的prop_aux
实现。但是,由于它只是扩展现有的 A
模型,因此它还调用 A
的 prop
实现(通过 super()
)。为了计算东西,A
的prop
实现调用prop_aux
。发生这种情况时,A
的prop
实现应调用A
的prop_aux
实现,而不是B
的prop_aux
实现(这会发生在self对象属于类B
的情况下。
现在希望每当调用 foo 时都调用 A 中的 bar
调用函数,传递类的实例
self
。
class A:
def foo(self):
self.bar() # outputs I am B
A.bar(self) # outputs I am A
def bar(self):
print('I am A')
class B(A):
def bar(self):
print('I am B')
b = B()
b.foo()
您可以在这里使用
staticmethod
。我会说,这在你的类设计中看起来像是代码味道。
就像
staticmethod
的大多数应用一样,只需定义和使用常规函数就足够了,并且可能更容易理解:
class A:
def foo(self):
self.bar()
_bar_a()
def _bar_a(self):
print('Iam A')
class B(A):
def bar(self):
_bar_b()
def _bar_b():
print('Iam B')