这两种设置默认值的方法是否等效?

时间:2019-09-26 13:42:53

标签: python class oop parameters

我有以下两种方法来设置对象中参数的默认值: 第一个:

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 个答案:

答案 0 :(得分:1)

有关评估默认参数的讨论,请参见this topic

echo "==== Building glfw (debug) ====" make --no-print-directory -C lib/glfw -f Makefile config=debug : echo "==== Building Celer (debug) ====" make --no-print-directory -C src/celer -f Makefile config=debug : echo "==== Building Sandbox (debug) ====" make --no-print-directory -C test/sandbox -f Makefile config=debug echo Linking Sandbox g++ -o "../../bin/linux-Debug-x86_64/Sandbox/Sandbox" ../../build/linux-Debug-x86_64/Sandbox/Sandbox.o -L/usr/lib64 -m64 ../../bin/linux-Debug-x86_64/Celer/libCeler.a : 仅在函数定义时评估一次,而def __init__(self, weight = Weight)则每次评估。因此,在这种情况下,您会看到不同的结果:

Test.Weight

答案 1 :(得分:1)

两种方法不相同。在第一个示例中,Test(None)会将weight设置为None,而在第二个示例中,它将导致将weight设置为Weight

除此之外,我更喜欢第一种方法,特别是如果很明显期望使用浮点数的话。只需写些就可以了。但是,如果您必须避免将weight设置为None,则可以将两者结合使用。

关于速度:我不会在乎第二种方法会花费几纳秒的时间。

编辑:,如其他答案所指出,如果更新Test.Weight,则默认参数将不会更新,但是在第二个示例中,您将始终设置更新后的值。如果有问题,请使用第二种方法。

答案 2 :(得分:1)

如果<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