关于python:Python面向对象基本语法2引用概念方法中的self参数

2次阅读

共计 1857 个字符,预计需要花费 5 分钟才能阅读完成。

一、强调援用的概念

在面向对象开发中,援用的概念是同样实用的。
在 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 自学网:www.wakey.com.cn

正文完
 0