2015-07-22 2 views
1

У меня есть функция класса, которая принимает на практике 4 аргумента, все переменные-члены класса. Обычно только один из этих аргументов изменяется за раз, а оставшееся время по умолчанию (текущие значения переменных-членов класса) передаются в функцию/выписываются, даже если они не меняются.Установить переменную экземпляра в качестве параметра по умолчанию для функции класса

Я думал, что лучше всего использовать эти переменные-члены класса по умолчанию, но мне сложно получить лучший синтаксис. Следующий код создает поведение, которое я желаю - используя переменную-член класса как параметр по умолчанию для функции. Но это некрасиво:

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 

Что лучший способ сделать это?

+0

лучший способ сделать это * это * 'парам = None' затем' если параметр является None: '(обратите внимание на тестирование * identity * not * равенство *)' param = self.a' Почему вы думаете, что это * «уродливый» *? – jonrsharpe

+0

Это действительно лучшее, что вы можете сделать. По умолчанию такие параметры, как 'param = []', относятся к одной и той же проблеме. – Lynn

+0

@ Маурис благодарит вас за быстрое подтверждение. – sunny

ответ

3

Ваша первая попытка вещий, единственное, что я хотел бы изменить это тест:

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

Проблема с проверкой на False является то, что нулевой и пустой контейнер (включая пустую строку) все разрешения на False ,

Если у вас есть большое количество из них, см Understanding kwargs in Python

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. 
Смежные вопросы