分享

python 代码中 self 有什么用途?

 网摘文苑 2022-11-29 发布于北京

在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

文章图片1

接下来再看一段使用 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)

输出结果如下图:

文章图片2

在以上这段代码中,这两句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 作为参数传递,运行即报错,如下图所示:

文章图片3

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

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

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

输出结果如下图:

文章图片4

(本文完)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多