Skip to main content
 首页 » 编程设计

python之python中的类默认参数

2025年05月04日14jpfss

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

请您参考如下方法:

Python 支持 parameters with a default value 的概念.可以写一个参数,不指定就给它一个默认值。在这种情况下,它看起来像:

class Car(): 
    '''car information summary''' 
 
    def __init__(self, make, model, year<b>, odometer=0</b>): 
        self.make = make 
        self.model = model 
        self.year = year 
        self.odometer = <b>odometer</b>

因此,如果您使用三个参数调用它,Python 会发现您没有为 odometer 参数提供值,并且它将隐式为其分配零.

有时会引起混淆的一点是,默认值只计算一次,在解释时,而不是每次调用 __init__ 函数时。

例如,如果我们写:

def f(x=[]): 
    return x 

然后 Python 将只评估 [] 一次。并且每次您不为 x 提供值时,您将获得对相同列表的引用(不是每次都是新列表)。

因此使用可变类型通常是危险的(int 不是可变类型,所以我们对里程表=0)。

如果我们因此例如 .append(3) 到 f() 的结果,那么从现在开始,f()将返回该列表 ([3])。这通常不是预期的效果。如果您使用可变对象,某些 IDE 会发出警告。

如果每次未提供 x 时您都想要一个新空列表,常见的模式是:

def f(x=<b>None</b>): 
    <b>if x is None: 
        x = []</b> 
    return x