我有以下两种方法来设置对象中参数的默认值: 第一个:
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。 我的问题是,这些方法是否等效,其中一种方法是否比另一种方法快(我的个人建议是,第一种方法执行所需的时间更少)?你更倾向哪个?还有其他更好的方法吗? 非常感谢
答案 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
。