这是静态方法的正确使用吗?

问题描述 投票:0回答:2

假设我有两个类

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
的情况下。

python inheritance static-methods
2个回答
0
投票

现在希望每当调用 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()

0
投票

可以在这里使用

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')
© www.soinside.com 2019 - 2024. All rights reserved.