python 代码中 self 有什么用途?

liftword4个月前 (01-12)技术文章25

在python语言中编写面向对象的代码时,都会遇到 self 这个参数,其代表一个类的实例。使用 self 访问一个类的方法和属性,就绑定了用参数所要表示的属性,之所以这样做的原因是,python没有提供相应的语法来指向实例的属性。python 中调用类的方法都是类的实例自动传递自身所拥有的方法,而不是自动接收传递来的方法:方法的第一个参数就是方法要调用的实例,self 总是指向当前对象。

看看下面一段代码中,self 和 obj 是否指向同一个对象:

class check:
    def __init__(self):
        print(" self 在内存中的地址:",id(self))
  
obj = check()
print(" 类的对象在内存的地址:",id(obj))

输出结果:

self 在内存中的地址: 2074376855360

类的对象在内存的地址: 2074376855360

接下来再看一段使用 self 的示例代码:

class car():
      
    # init 方法, 即constructor
    def __init__(self, model, color):
        self.model = model
        self.color = color
          
    def show(self):
        print("车型:", self.model )
        print("颜色:", self.color )
          
# 两个对象有不同的 self,各自的self包含各自的属性
audi = car("奥迪 a4", "蓝色")
ferrari = car("法拉利 488", "红色")
  
audi.show()     
#car.show(audi) # 输出结果与上句相同

ferrari.show()   
#car.show(ferrari) # 输出结果与上句相同
  
# 也可以像以下这样使用
print("奥迪车型是: ",audi.model)
print("法拉利的颜色是: ",ferrari.color)

输出结果如下图:

在以上这段代码中,这两句print("奥迪车型是: ",audi.model) 和 print("法拉利的颜色是: ",ferrari.color) ,首先由constructor构建方法,给两个具体的对象指定了具体的对象,再给属性赋值,就完成了对象的初始化,属性(model,color)和对象(audi,ferrari)就建立了联系。这种情形的背后,每个实例中都调用了方法,并把实例及其对应的方法一起发送给所调用的方法(car.show(audi),car.show(ferrari)),其中 self 是constructor构建方法和实例方法要传递的第一个参数。

对于实例的方法和 constructor 构建方法而言,self 必须作为第一个参数,否则就会报错。看看下面的示例代码:

# Self 必须是第一个参数
class check:
    def __init__():
        print("这是构建方法 Constructor")
  
object = check()
print(" 本段代码运行正常")
  
  
# 没有把 self 作为参数传递,所以报错以下错误
Traceback (most recent call last):
  File "/home/c736b5fad311dd1eb3cd2e280260e7dd.py", line 6, in <module>
    object = check()
TypeError: __init__() takes 0 positional arguments but 1 was given

以上代码段中,类check中定义的 __init__ 方法没有把 Self 作为参数传递,运行即报错,如下图所示:

特别注意:Self 是python中的一种惯例用法,可以称为(实例方法的)参数,但不是关键字,可以用其他的名称代替,但一般建议还是使用 Self 这个名称,以便更容易地阅读代码。

以下代码段中 把 Self 替换为其他名称:

class this_is_class: 
    def __init__(in_place_of_self): 
        print("把参数 Self的名称改为 in_place_of_self") 
          
object = this_is_class() 

输出结果如下图:

(本文完)

相关文章

python究竟可以用来做些什么

这里就不撰述python的一些像什么“高级语言”之类的比较常规的介绍了,还是老样子,说说一些比较常用的东西吧。python是什么python,一款可编程的开源软件,很多第三方库、框架也是开源的,比如强...

新手可直接使用的python最强大的功能之一:列表

大家好,我是刘会计~今天我们要学习的内容是列表,列表是新手可直接使用的最强大的python功能之一,本文将为大家介绍以下内容:什么是列表、从列表提取单个元素、从列表提取多个元素、给列表增加/删除元素。...

python 代码中 __main__ 有什么用途?

使用python编写自己的程序时,都会用到 __init__.py 和 __main__ 这两个代码模块,有关 __init__ 的相关内容可以阅读文章《python 代码中 __init__ 是什么...

学习Python都能做什么?看完这些小学生作品程序员直呼后生可畏

提起《我的世界》这款3D第一人称沙盒游戏,几乎无人不晓。无论是成年玩家还是小朋友都可尽情释放创造力与想象力,构建一个专属自己的理想国。设计游戏场景与环境,制定创意多变的玩法与任务,添加森林、沙漠等生物...

Python中不可错过的五个超有用的神仙级函数

在本文中,我们用代码详细说明了Python中超实用的5个函数的重要作用。这些函数虽然简单,但却是Python中功能最强大的函数。Python有许多库和内置函数,理解并正确使用这些函数有助于帮助我们进行...