class Phone(): def call(self): print("phone",self.price) phone1 = Phone() phone1.price = 1000 phone1.call() phone2 = Phone() phone2.call()
这样,在call方法里,无法保证每个对象都有price这个属性,会报错 AttributeError: 'Phone' object has no attribute 'price'
这时就用到__init__(),让每一个对象都有这些属性
class Phone(): def __init__(self): self.brand = "xiaomi" self.price = 2999 def call(self): print("phone",self.price) phone1 = Phone() phone1.price = 1000 phone1.call() phone2 = Phone() phone2.call()
phone 1000
phone 2999
在执行 phone1 = Phone()时会有4步:
- 找有没有一块空间是Phone,已经创建了Phone类,所以有这块空间
- 利用Phone类,向内存申请一块和Phone一样的空间
- 去Phone找有没有__init__,如果没有,则将开辟的空间给了对象名P
- 如果有__init__,则会进入__init__方法执行里面的动作,self传入的为开辟的地址,然后将内存地址赋值给对象P
画图理解为: