python2.7:在实例方法中传递kwargs

2024-04-26 04:14:49 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我想从一个函数到另一个函数传递一个参数列表,我可以使用locals函数。但是,如果我在一个实例方法中,这就失败了,因为self不能作为kwarg传递。我可以创建一个本地字典,然后删除self。不过,我在想,如果我能做的更多,我会觉得很优雅。在

class MyObj:
    def test(self, a=1, b=2, c=3, d=4):
        return [a,b,c,d]

class MyVerboseObj(MyObj):
    def test(self, a=1, b=2, c=3, d=4):
        print "RUNNING TEST a=%d"%a
        kwargs = locals()
        del kwargs["self"]
        return MyObj.test(self, **kwargs)

MyVerboseObj().test()

有没有更好的方法来传递相同的列表参数MyVerboseObj.测试到我做的测试?在

**更新**

这是一个简单的例子来说明我的问题。一个更实际的例子可能是:

^{pr2}$

我有很多show对象,它们具有不同的变量,由不同的模块和不同的命名约定定义——我正试图创建具有通用功能的show对象。在


Tags: 方法函数testself列表参数returndef
2条回答

如果您不想重写父函数(因为您想使用它),只需通过给它一个不同的名称来避免重写它!在

class MyObj:
    def base_test(self, a=1, b=2, c=3, d=4):
        return [a,b,c,d]

class MyVerboseObj(MyObj):
    def test(self, a=1, b=2, c=3, d=4):
        print "RUNNING TEST a=%d"%a
        kwargs = locals()
        del kwargs["self"]
        return self.base_test(**kwargs)

print MyVerboseObj().test()

使用locals()很少是个好主意。这种方法很混乱,很容易对代码进行修改,因为添加任何局部变量都会扰乱调用。在

我会更明确地说:

class MyObj:
    def test(self, a=1, b=2, c=3, d=4):
        return [a,b,c,d]

class MyVerboseObj(MyObj):
    def test(self, a=1, b=2, c=3, d=4):
        print "RUNNING TEST a=%d"%a
        return MyObj.test(self, a, b, c, d)

MyVerboseObj().test()

我知道这很乏味,但它避免了一些麻烦。而且效率更高。在

或者,如果您不介意丢失签名,您可以接受*args, **kwargs作为重写函数的参数:

^{pr2}$

在这个版本中访问a会有点麻烦,但是由于您对第二个示例中的参数不太感兴趣,所以这可能是更简单的解决方案。在

附带说明:随着继承结构变得更加复杂(即多重继承),您可能需要开始使用super()方法:

class MyObj:
    def test(self, a=1, b=2, c=3, d=4):
        return [a,b,c,d]

class MyVerboseObj(MyObj):
    def test(self, *args, **kwargs):
        print "RUNNING TEST"   
        super(MyObj, self).test(*args, **kwargs)

MyVerboseObj().test()

相关问题 更多 >