一、强调援用的概念
在面向对象开发中,援用的概念是同样实用的。
在python中应用类创建对象后,tom变量中依然记录的是对象在内存中的地址,也就是tom变量援用了新建的猫对象。
应用print输入对象变量,默认状况下,是可能输入这个变量援用的对象是由哪一个类创立的对象,以及在内存中的地址(十六进制示意)
提醒: 在计算机中,通常应用十六进制示意内存地址。
(1) 十进制和十六进制都是用来表白数字的,只是示意的形式不一样(2) 十进制和十六进制的数字之间能够来回转换%d能够以十进制输入数字%x能够以十六进制输入数字
代码:
class Cat: def eat(self): print("小猫爱吃鱼") def drink(self): print("小猫要喝水")# 创立猫对象名字叫tomtom = Cat()# 调用对象的办法tom.eat()tom.drink()# 应用print输入对象变量print(tom)# 利用函数id()查问数据在内存中的地址addr = id(tom)print("%d" % addr) # %d能够以十进制输入数字print("%x" % addr) # %x能够以十六进制输入数字
执行后果:
__main__:前面介绍模块式再具体的阐明一下
Cat:这个是下面代码中创立的猫类:
object:示意对象的意思
0x0000000002901160:内存地址
Cat object at 0x0000000002901160:猫类创立的对象地址是0x0000000002901160
二、案例进阶
需要:应用Cat类再创立一个对象black
问题1:tom和black是同一个对象吗?
问题2:black_2 和 black是什么关系?
代码验证:
class Cat: def eat(self): print("小猫爱吃鱼") def drink(self): print("小猫要喝水")# 创立猫对象名字叫tomtom = Cat()# 调用对象的办法tom.eat()tom.drink()print(tom)# 再创立一个对象叫blackblack = Cat()black.eat()black.drink()print(black)black_2 = blackprint(black_2)
执行后果:
问题1答案:tom和black是同一个对象,因为从执行后果能够看出对象的地址是一样的
问题2答案:black_2和black是同一个对象同一个猫,因为从执行后果能够看出对象的地址是一样的
在第22行代码中,在内存中为black调配一个小格子,而后把black这个标签贴在了这个小格子身上,在第29行代码,让black_2等于black就设想等把black_2也贴在了这个小格子身上。不论black_2也好还是black也好都是同一只猫。
总结:在应用面向对象开发程序时,类能够只有一个,然而能够应用雷同的类创立出很多个不同的对象。
三、办法中的self参数
3.1 案例革新 - 给对象减少属性
在python中,要给对象设置属性非常容易,只须要在类的内部的代码中间接通过点.设置一个属性即可,然而不举荐应用,因为对象属性的封装应该封装在类的外部。
留神:这种形式尽管简略,然而不举荐应用
代码演示:
# 能够应用.属性名 利用赋值语句就能够了tom.name = "Tom"black.name = "黑黑"
残缺代码和执行后果如下图:
3.2 利用self在类封装的办法中输入对象属性
由哪一个对象调用的办法,办法内的self就是哪一个对象的援用。
在类封装的办法外部,self就示意以后调用办法的对象本人。
在调用办法时:程序员不须要传递self参数
在办法外部: 能够通过self. 拜访对象的属性,也能够通过self. 调用其余的对象办法.
利用Debugger工具,在13行代码前打上断点,而后点击F7键,控制台能够看的进去,tom这个变量当初援用了猫对象,猫对象保留的内存地址是76A0,如果之前增加了属性,点击最右边的三角能够看到属性在上面。点击F7,进入到第一个办法之后,能够看到self同样是一个猫对象,self的内存地址同样是76A0,self的内存地址和tom的内存地址齐全是截然不同的。利用这个断点调试,能够看出,self就是这个tom变量指向的猫对象,能够得出:哪一个对象调用的办法,self就是哪一个对象的援用。
再把代码稍作批改如下图:通过self. 拜访对象的属性
能够在利用debugger工具看看执行步骤后果。
更多相干Python面向对象知识点可关注Python自学网: www.wakey.com.cn