编程语言
首页 > 编程语言> > 如何在python中重写方法默认参数?

如何在python中重写方法默认参数?

作者:互联网

方法默认参数可以显然被覆盖:

>>> class B:
...     def meth(self, r=True): print r
>>> class D(B):
...     def meth(self, r=False): print r
... D().meth()
False
>>> B().meth()
True

这怎么可能 ?它被认为是不好的风格?

解决方法:

您可以以任意方式更改重写方法的签名. Python不关心:

class Base:
    def foo(self, x, y):
        pass

class Deriv(Base):
    def foo(self, blah=100):
        pass

但如果你问

Is it considered bad style ?

答案是肯定的,因为它违反了重要的Liskov substitution principle

if Deriv extends Base, you must be able to replace all occurrences of Base with Deriv without breaking your program.

换句话说,派生类必须满足基类提供的所有契约.特别是,重写的方法必须具有相同的签名和类似的语义.由于Python对此没有帮助,您必须在IDE的帮助下手动控制它(此处为Intellij IDEA):

要回答关于覆盖默认参数的具体问题,我想答案是“它取决于”.如果param是一个只在内部使用并且不影响对象的可观察行为的选项,那么更改它是没有错的:

class Buffer:
    def __init__(self, init_size=16):

class BigBuffer(Buffer):
    def __init__(self, init_size=1024):

另一方面,如果param实际上影响了语义,那么它就是合同的一部分,不应该被覆盖.例如,这段代码会令人困惑

class Test:
    def test_equal(self, a, b, fail_if_equal=False):

class MyTest(Test):
    def test_equal(self, a, b, fail_if_equal=True):

标签:default-arguments,python,python-2-7,inheritance,methods
来源: https://codeday.me/bug/20190824/1712755.html