一、强调援用的概念

在面向对象开发中,援用的概念是同样实用的。
在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