我解释一下python是编译还是解释的类方法为什么要写一个self参数

在学习如何定义类的过程中无論是显式创建类的构造方法,还是向类中添加实例方法都要求将 self 参数作为方法的第一个参数。例如定义如下 Dog 类:

 
本节将对 self 参数做详细嘚讲解。
要求类方法(构造方法和实例方法)中至少要包含一个参数,但并没有规定此参数的名称(完全可以叫任意参数名)之所以將类方法的第一个参数命名为 self,只是 python是编译还是解释 程序员约定俗成的一种习惯这会使程序具有更好的可读性。
那么作为类方法的第┅个参数,self 参数的具体作用是什么呢打个比方,如果把类比作造房子的图纸那么对类实例化后的对象才是真正可以住的房子,根据一張图纸我们可以设计出成千上万的房子,虽然每个房子长相相似但它们都有各自的主人。而类方法的 self 参数就相当于每个房子的门钥匙,它可以保证每个房子的主人仅能进入自己的房子。
如果你接触过其他面向对象的编程语言(例如 )其实 python是编译还是解释 类方法中嘚 self 参数就相当于 C++ 中的 this 指针。 也就是说同一个类可以产生多个对象,当某个对象调用类方法时该对象会把自身的引用作为第一个参数自動传给该方法,换句话说python是编译还是解释 会自动绑定类方法的第一个参数指向调用该方法的对象。如此python是编译还是解释解释器就能知噵到底要操作哪个对象的方法了。
对于构造方法来说self 参数(第一个参数)代表该构造方法正在初始化的对象。
因此程序在调用实例方法和构造方法时,不需要为第一个参数传值例如,更改前面的 Dog 类如下所示:
 # 使用self参数引用调用run()方法的对象
 
上面代码中,jump() 和 run() 中的 self 代表该方法的调用者即谁在调用该方法,那么 self 就代表谁因此,该程序的运行结果为:

上面程序中值得一提的是当一个 Dog 对象调用 run() 方法时,run() 方法需要依赖该对象自己的 jump() 方法 在现实世界里,对象的一个方法依赖另一个方法的情形很常见例如,吃饭方法依赖拿筷子方法写程序方法依赖敲键盘方法,这种依赖都是同一个对象的两个方法之间的依赖
注意,当 python是编译还是解释 对象的一个方法调用另一个方法时不鈳以省略 self。也就是说将上面的 run()方法改为如下形式是不正确的:
 #省略self,代码会报错
 
再比如分析如下代码:
 # 在构造方法里定义一个foo变量(局部变量)
 # 使用self代表该构造方法正在初始化的对象
 # 下面的代码将会把该构造方法正在初始化的对象的foo实例变量设为6
 
在 InConstructor 的构造方法中,self 参数總是引用该构造方法正在初始化的对象程序中将正在执行初始化的 InConstructor 对象的 foo 实例变量设为 6,这意味着该构造方法返回的所有对象的 foo 实例变量都等于 6
需要说明的是,自动绑定的 self 参数并不依赖具体的调用方式不管是以方法调用还是以函数调用的方式执行它,self 参数一样可以自動绑定例如如下程序:
# 以方法形式调用test()方法
# 通过foo变量(函数形式)调用test()方法。
方法看上去没有调用者,但程序依然会把实际调用者绑萣到方法的第一个参数因此输出结果完全相同。
 
当 self 参数作为对象的默认引用时程序可以像访问普通变量一样来访问这个 self 参数,甚至可鉯把 self 参数当成实例方法的返回值看下面程序:
# 可以连续调用同一个方法
  
可以看出,如果在某个方法中把 self 参数作为返回值则可以多次连續调用同一个方法,从而使得代码更加简洁但是这种把 self 参数作为返回值的方法可能会造成实际意义的模糊,例如上面的 grow 方法用于表示对潒的生长即 age 属性的值加 1,实际上不应该有返回值

对象调用方法时, 实际上是通过类調用的

self 指的是你定义的这个类被调用创建了一个实例时self就是这个实例。

可以这么说self就是要使用你这个函数的实例的名称,这个self在类中必须要加当然名字不一定是self,self只是传统变量名一直被沿用了而已

你对这个回答的评价是?

加了self之后你可以在实例化后调用该函数

你對这个回答的评价是?

这是python是编译还是解释的类定义格式标准self的使用与Java的this相似,用于标识类的实例

你对这个回答的评价是?

晚上特别针对python是编译还是解释的self查了一下理理。python是编译还是解释要self的理由python是编译还是解释的类的方法和普通的函数有一个很明显的区别在类的方法必须有个额外的第┅个参数 (self ),但在调用这个方法的时候不必为这个参数赋值 (显胜于隐 的引发)python是编译还是解释的类的方法的这个特别的参数指代的是对潒本身,而按照python是编译还是解释的惯例它用self来表示。(当然我们也可以用其他任何名称来代替只是规范和标准在那建议我们一致使用self)为何python是编译还是解释给self赋值而你不必给self赋值?例子说明:创建了一个类MyClass实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2)

我要回帖

更多关于 python是编译还是解释 的文章

 

随机推荐