在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 的示例代码:
输出结果如下图: ![]() 在以上这段代码中,这两句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 替换为其他名称:
输出结果如下图: ![]() (本文完) |
|