Эти два способа установки значений по умолчанию эквивалентны? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть два способа установки значений по умолчанию для параметра в объекте: первый:

class Test():
    Weight = 12.5

    def __init__(self, weight = Weight):
        self.weight = weight


 Testing = Test()
 print("First testing: {}".format(Testing.weight))

и второй:

class Test2():
    Weight = 12.5

    def __init__(self, weight = None):
        if weight is None:
            self.weight = Test2.Weight

Testing2 = Test2()
print("Second testing: {}".format(Testing2.weight))

Оба приводят к ожидаемому формату, которыйони будут печатать 12,5.Мой вопрос заключается в том, являются ли эти способы эквивалентными, является ли один из них более быстрым, чем другой (мой личный совет - выполнение первого займет меньше времени)?Какой из них вы предпочитаете?и есть ли другой, может быть, лучший способ?Большое спасибо

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

Два метода не идентичны.В первом примере Test(None) приведет к установке weight в None, тогда как во втором примере это приведет к установке weight в Weight.

Кроме того, я быПредпочитаю первый метод, особенно если ясно, что ожидается плавание.Это просто меньше писать.Но если вам придется избегать установки weight в None, то можно использовать комбинацию обоих.

Относительно скорости: мне не нужны дополнительные несколько наносекунд, которые будут стоить второму методу.

Редактировать: , как указано в других ответах, если вы обновите Test.Weight, параметр по умолчанию не будет обновлен, но во втором примере вы всегда будете устанавливать обновленное значение.Если это проблема, используйте второй метод.

1 голос
/ 26 сентября 2019

Это не так, если <class>.weight обновляется:

class Test1():
    Weight = 12.5

    def __init__(self, weight = Weight):
        self.weight = weight


testing = Test1()
print("First testing: {}".format(testing.weight))
Test1.Weight = 50
testing2 = Test1()
print("Second testing: {}".format(testing2.weight))

# First testing: 12.5
# Second testing: 12.5


class Test2():
    Weight = 12.5

    def __init__(self, weight = None):
        if weight is None:
            self.weight = Test2.Weight

testing = Test2()
print("First testing: {}".format(testing.weight))
Test2.Weight = 50
testing2 = Test2()
print("Second testing: {}".format(testing2.weight))
# First testing: 12.5
# Second testing: 50

Аргумент по умолчанию оценивается один раз при создании метода, поэтому в первом случае значением по умолчанию будет 12.5, что бы ни случилось сTest1.weight.

1 голос
/ 26 сентября 2019

См. в этой теме для обсуждения оценки аргументов по умолчанию.

def __init__(self, weight = Weight) будет оцениваться только один раз во время определения функции, тогда как Test.Weight будет оцениваться каждый раз,Так что в этом случае вы увидите разные результаты:

testing = Test()
Test.Weight = 42
testing2 = Test()
print(testing.weight, testing2.weight)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...