关于这段代码:
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来访问,通过默认构造函数的参数来传递属性的话,你可以在外部修改或者初始化这个属性
你两段代码的odometer_reading都在初始化函数中的啊。
我觉得你想问的是为什么不通过参数传递odometer_reading这个变量的初始化值吧?
这是因为常规情况下,初始化里程就是0,没有必要做个参数,并非所有属性都必须通过传参初始化的。当然,如果写成下面的方式也是可以的,每次传入0就好了。
对于self变量,其实就是一个指针,指向这个类实例的起始地址,self.make之类的变量的本质就是在self基础上的偏移量。建议好好学学对象和实例的关系,就能理解self的意义了