Python「面向对象基本语法2」引用概念、方法中的self参数、代码示例
一、强调引用的概念
在面向对象开发中,引用的概念是同样适用的。
在python中使用类创建对象后,tom变量中仍然记录的是对象在内存中的地址,也就是tom变量引用了新建的猫对象。
使用print输出对象变量,默认情况下,是能够输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制表示)
提示: 在计算机中,通常使用十六进制表示内存地址。
- (1) 十进制和十六进制都是用来表达数字的,只是表示的方式不一样
- (2) 十进制和十六进制的数字之间可以来回转换
%d可以以十进制输出数字
%x可以以十六进制输出数字
代码:
class Cat:
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫要喝水")
# 创建猫对象名字叫tom
tom = 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("小猫要喝水")
# 创建猫对象名字叫tom
tom = Cat()
# 调用对象的方法
tom.eat()
tom.drink()
print(tom)
# 再创建一个对象叫black
black = Cat()
black.eat()
black.drink()
print(black)
black_2 = black
print(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自学网
相关文章
- YYDS!一行Python代码即可实现数据可视化大屏
- 一个 15 年未修补 Python 漏洞让攻击者可以执行代码:35 万个开源代码存储库岌岌可危
- python中itchat_python打招呼的代码
- 21张让你Python代码能力突飞猛进的速查表
- python源码之家_python画图代码大全
- 分享一个简单的 Python 脚本库:将 requests 代码转换成 curl 命令
- WTF!只需一行Python代码即可玩20几款小游戏
- Python 分形算法__代码里开出来的数学之花
- Jupyter Notebook又一利器Visual Python,拯救不想写代码!
- 只用了20行Python代码就攻破了网站登录
- python画图小代码
- 【开源分享】教你如何在HTML中执行Python脚本代码!超级简单赶紧收藏。
- 用python写一个简单的表白代码
- python基本代码大全_python怎么运行代码
- 送你情人节(劫)专属Python全套代码
- Linux 上使用 crontab 设置定时任务及运行 Python 代码不执行的解决方案
- python表白代码-python告白代码,只属于程序员的浪漫
- 几行 Python 代码就可以提取数百个时间序列特征
- 10行python代码做出哪些酷炫的事情?
- python灰度图生成g代码_tcam2009利用灰度图生成雕刻机所需的G代码