python中的类默认参数

时间:2017-12-28 21:17:11

标签: python oop

如果我创建一个名为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来说这是错误的想法吗?

1 个答案:

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