有些参数为什么不放进__init__()中?

关于这段代码:

class Car:
def init(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0

2个问题:
1、为什么不把odometer_reading=0 放进 init()中?然后代码如下:
class Car:
def init(self,make,model,year,odometer_reading=0):
self.make = make
self.model = model
self.year = year
self.odometer_reading = odometer_readming

2、关于self,虽然知道他应该是一个传递参数的功能,但是作为初学者,其实还不是完全理解,希望得到解惑!谢谢

不放到init函数参数里的唯一原因就是这个变量初始值就是0,不允许改变,就以这个Car为例,里程数在一辆车刚被造出来的时候,必然是0,要不然你新造的车就有了1万公里的里程数,那总不能是在工厂里跑出来的,如果你非要放到init函数中,那这个类就应该描述的是新车和二手车的通用类,因为只有二手车初始的里程数才会不为0,这两种写法都没错,区别就在于初始值必须为0是否有实际意义

odometer_reading写到哪里都可以,第一种是想每次创建的时候默认为0,需要在修改
python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法

class Car1:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0


class Car:
    def __init__(self, make, model, year, odometer_reading=0):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = odometer_reading


if __name__ == '__main__':
    # Car1
    car1 = Car1(make="make_car1", model='model_car1', year='2022_car1')
    print("Car1对象:", car1.odometer_reading)
    car2 = Car(make="make_car1", model='model_car1', year='2022_car1', odometer_reading=111111)
    print("Car对象:", car2.odometer_reading)

class 是面向对象,如果你有其他买面向对象语言(C++,Java)的基础的话,你就会知道这个__init__函数是默认构造函数,在里面设置的self.xxx是这个类的一个属性,当你实例化一个对象的时候,对象就会有这个属性。可以通过.xxx来访问,通过默认构造函数的参数来传递属性的话,你可以在外部修改或者初始化这个属性

img

你两段代码的odometer_reading都在初始化函数中的啊。
我觉得你想问的是为什么不通过参数传递odometer_reading这个变量的初始化值吧?
这是因为常规情况下,初始化里程就是0,没有必要做个参数,并非所有属性都必须通过传参初始化的。当然,如果写成下面的方式也是可以的,每次传入0就好了。

对于self变量,其实就是一个指针,指向这个类实例的起始地址,self.make之类的变量的本质就是在self基础上的偏移量。建议好好学学对象和实例的关系,就能理解self的意义了

  1. 是默认参数,你可以理解成它是这个函数的“原住民”,虽然其他参数会变化,但是它始终属于这个函数
  2. self你也可以理解成是class里面一个标志性工具,它帮助class用来赋值,调用参数