python重写类方法和静态方法_在Python中重写一个静态方法

在Python中重写一个静态方法

在这里提到关于python绑定和非绑定方法的第一个答案 ,我有一个问题:

class Test: def method_one(self): print "Called method_one" @staticmethod def method_two(): print "Called method_two" @staticmethod def method_three(): Test.method_two() class T2(Test): @staticmethod def method_two(): print "T2" a_test = Test() a_test.method_one() a_test.method_two() a_test.method_three() b_test = T2() b_test.method_three()

产生输出:

Called method_one Called method_two Called method_two Called method_two

有没有办法在Python中重写静态方法?

我期望b_test.method_three()打印“T2”,但不打印(改为打印“调用method_two”)。

在你使用的表单中,你明确地指定了要调用哪个类的静态method_two 。 如果method_three是一个classmethod,并且你调用了cls.method_two ,你会得到你想要的结果:

class Test: def method_one(self): print "Called method_one" @staticmethod def method_two(): print "Called method_two" @classmethod def method_three(cls): cls.method_two() class T2(Test): @staticmethod def method_two(): print "T2" a_test = Test() a_test.method_one() # -> Called method_one a_test.method_two() # -> Called method_two a_test.method_three() # -> Called method_two b_test = T2() b_test.method_three() # -> T2 Test.method_two() # -> Called method_two T2.method_three() # -> T2

你看到的行为是预期的行为。 静态方法是…静态的。 当您调用method_three()定义的method_three() ,它肯定会调用由Test定义的method_two() 。

至于如何“摆脱”这种正确的行为…

当你想要虚拟行为的时候,最好的方法就是让方法变成虚拟的。 如果你用一个你希望是虚拟的静态方法阻塞了一些库代码,那么你可能会更深入地看看是否有一个原因,或者只是一个疏忽。

否则,可以在T2中定义一个调用T2.method_two()的新T2.method_two() 。

另外,如果你想在没有实例的情况下调用“虚拟静态”函数,你可以这样做:

在基类非静态声明函数如下所示:

class Base: def my_fun(self): print('my_fun base') class Derived(Base): def my_fun(self): print('my_fun derived')

通过传递不是实例的类类来调用它,如下所示:

Derived.my_fun(Derived)

请注意,如果您有一个variables“class_type”,只有在运行时才知道这个variables,那么这很有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值