python代码中self有什么用途?

在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

python代码中self有什么用途?

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

输出结果如下图:

python代码中self有什么用途?

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

python代码中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代码中self有什么用途?

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/76241
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 11 日
下一篇 2024 年 7 月 11 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注