将实例变量设置为类函数

时间:2015-07-22 16:17:14

标签: python class

我有一个类函数,它接受4个参数,所有类成员变量都在实践中。通常一次只修改其中一个参数,其余时间将默认值(类成员变量的当前值)传递给函数/写出,即使它们没有改变。 / p>

我认为最好的方法是将这些类成员变量设为默认值,但我很难获得最佳语法。以下代码生成我想要的行为 - 使用类成员变量作为函数的默认参数。但它很难看:

class test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def testfunc(self, param = None):
        if not param:
            param = self.a
        print(param)


if __name__ == '__main__':
    a1 = test(1, 3)
    a1.testfunc()
    a2 = test(5, 5)
    a2.testfunc()
   #(prints 1 and 5 when called)

我想使用以下内容:

    def testfunc(self, param = self.a):
        print(param)

但这会产生错误:

NameError: name 'self' is not defined

更好的方法是什么?

2 个答案:

答案 0 :(得分:3)

你的第一次尝试是pythonic,我唯一要改变的是测试:

 def testfunc(self, param = None):
        if param is None:
            param = self.a
        print(param)

测试False的问题是零和空容器(包括空字符串)都解析为False

如果您有大量这些内容,请参阅Understanding kwargs in Python

答案 1 :(得分:0)

如果你的函数有4个参数,并且所有4个参数都是可选的,并且对象本身具有匹配的属性,那么你可以使用关键字参数使这个更简单:

def testfunc(self, **kwargs):
    a, b, c, d = [kwargs.get(name, getattr(self, name)
                  for name in ('a', 'b', 'c', 'd')]

然后,您需要使用关键字参数调用此方法:

obj.testfunc()  # all values are defaults
obj.testfunc(a=1)  # a=1, all other values are defaults
obj.testfunc(b=2, d=5)  # etc.