如果我创建一个名为Car的类
class Car():
'''car information summary'''
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer = 0
我了解到self.odometer=0
允许我创建一个新实例而不为里程表赋值。每个新实例都将以0的里程表读数开始。
但是如果我想创建一个具有指定里程表读数的新实例呢?
car_1 = Car('Audi', 'S4', '2017', 5000)
它不允许我这样做。我要做的是将其用作函数的默认值:您不必提供值,因为有默认值,但是当您这样做时,您可以覆盖默认值。
我确实理解我之后可以修改属性,或者编写一个方法来更改属性。但这不是我现在所关心的问题。
对于OOP来说这是错误的想法吗?
答案 0 :(得分:7)
Python支持parameters with a default value的概念。您可以编写参数,如果未指定参数,则为其指定默认值。在这种情况下,它看起来像:
class Car():
'''car information summary'''
def __init__(self, make, model, year, odometer=0):
self.make = make
self.model = model
self.year = year
self.odometer = odometer
因此,如果您使用三个参数调用它,Python将看到您没有为odometer
参数提供值,并且它将隐式地为其分配零。
有时会引起混淆的一点是,默认值仅在解释时评估一次,而不是每次调用__init__
函数时。
例如,如果我们写:
def f(x=[]):
return x
然后,Python只会评估[]
一次。每次您没有为x
提供值时,您将获得对相同列表的引用(每次都不是新列表)。
因此,使用可变类型(int
不是一种可变类型通常是危险的,因此我们对odometer=0
是安全的)。
如果我们例如.append(3)
f()
的结果,那么从现在起,f()
将返回该列表([3]
)。这通常不是预期的效果。如果您使用可变对象,某些IDE将发出警告。
如果您希望每次x
未提供新空列表,则常见模式为:
def f(x=None):
if x is None:
x = []
return x