首页 > 解决方案 > 我可以在子类方法中更改父类方法的默认行为吗?

问题描述

我正在学习简单的python继承,我希望我的父类方法默认参数之一有条件地更改为我的子类参数值之一,我不知道这是否可能。

这是我想做的一个例子:

class Parent(object):

    def __init__(self, name):
        self.name = name

    def doSomething(self, name, strict = True):
        if strict:
            return self.name
        else:
            return name

class Child(Parent):

    def __init__(self, name, **kwargs):
        super(Child, self).__init__(name)

        if 'changeBehavior' in kwargs:
            # Here is the thing:
            # Can I change the default value of strict to kwargs['changeBehavior']
            # in a way that when I later call doSomething(), it will behave according
            # to its new default behavior?
            def doSomething(self, name, strict = kwargs['changeBehavior']):
                super(Child, self).doSomething(strict = kwargs['changeBehavior'])

如果可以通过这种方式完成,还有其他方法吗?

谢谢

标签: pythoninheritance

解决方案


您可以使用partial.

from functools import partial

class Parent(object):
    def __init__(self, name):
        self.name = name

    def doSomething(self, name, strict=True):
        print('Got strict={}'.format(strict))
        if strict:
            return self.name
        else:
            return name


class Child(Parent):
    def __init__(self, name, **kwargs):
        super().__init__(name)
        change_behavior = kwargs.get('changeBehavior')
        if change_behavior is not None:
            self.doSomething = partial(self.doSomething, strict=change_behavior)


p = Parent('name')
c = Child('name', changeBehavior=False)

p.doSomething('name')
c.doSomething('name')

输出

Got strict=True
Got strict=False

推荐阅读