1、self参数的理解
在pycharm中输入如下代码
class Cat:
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫爱喝水")
tom = Cat()
tom.name = "大黄" # 此书写方式只是演示,日常编写不推荐使用,应该封装在类的内部
tom.eat()
tom.drink()
在创建对象tom = Cat() 处打下断点,再debug后进行单目执行,此时发现tom变量在内存中的地址为0x000002190C21F190,如下图
再接着按F8,当程序执行到第9行tom.eat() 处时,按键盘F7,进入到eat方法中,如下图:
可看到,self也是Cat对象,self在内存中的地址与tom对象在内存中的地址一样,同时,self也有name属性,且属性值与tom的name属性值一致。通过此次断点调试发现:
在tom变量调用eat方法时,self就是tom这个变量,也就是说,哪一个对象调用此方法,self就是哪一个对象的引用。
哪一个对象 调用的方法,方法内的
self
就是 哪一个对象的引用
- 在类封装的方法内部,
self
就表示 当前调用方法的对象自己 - 调用方法时,程序员不需要传递
self
参数 - 在方法内部
- 可以通过
self.
访问对象的属性 - 也可以通过
self.
调用其他的对象方法
- 可以通过
- 在日常开发中,应避免在类的外部给对象增加属性,因为如果在运行时没有找到该属性,程序是会报错的,对象包括哪些属性应该封装在类的内部。
2、__init__()函数的理解
当使用 类名() 创建对象时,python解释器会自动执行以下操作:
1) 为对象在内存中分配空间——创建对象
2)为对象的属性设置初始值——初始化方法(该初始化方法就是__init__方法,它是对象的内置方法)
__init__方法是专门 用来定义一个类 具有哪些属性 的方法!
2.1 python会自动执行初始化函数__init__():
当tom对象被创建时,类中的__init__方法会被自动调用,如下图所示:
2.2 在初始化函数__init__()内部中定义属性
- 在
__init__
方法内部使用self.属性名 = 属性的初始值
就可以 定义属性 - 定义属性之后,再使用
Cat
类创建的对象,都会拥有该属性
在代码中给类添加了属性name,该属性的值为“Tom”,tom对象使用Cat类创建后,tom对象自动拥有了name属性,如下图:
2.3初始化函数__init__()方法改造,初始化的同时设置初始值
我们再创建一个garfield 对象,garfield 在调用eat方法时,它和tom在调用eat方法时打印的语句完全一样,因为name属性在初始化时给了默认值“Tom”。
为了能让使用Cat类创建的多个对象都有自己的name属性,且属性值不一样,可以在__init__函数中增加一个形参。
- 在开发中,如果希望在 创建对象的同时,就设置对象的属性,可以对
__init__
方法进行 改造- 把希望设置的属性值,定义成
__init__
方法的参数 - 在方法内部使用
self.属性 = 形参
接收外部传递的参数 - 在创建对象时,使用
类名(属性1, 属性2...)
调用
- 把希望设置的属性值,定义成