关于python的self
2016-05-21 22:01
337 查看
我们在使用python工作的过程中,常常被其类内繁多的self所困扰,在这里总结一下我对self的理解。
这是python中一个简单的类,如果我们删掉其中的self,会得到下面这个错误。
这个报错给人一种分外眼熟的感觉,比如如下的代码就会得到完全相同的错误。
这其实就是编译器在警告我们这里的形参数量为零,但是我们却传递了一个实参进去。然而在第一段代码中我们调用这个方法的时候,并没有传递任何实参。因此实际上是编译器在编译之前对我们的代码进行了预处理,在实参列表的最前面为我们自动加上了一个实参用来传递指针,有一点类似C中的this指针。
因此我们虽然是像:
这样来调用这个方法,但实际上真正进行编译的代码类似于这样:
因此self其实并不是一个关键字,他只是一个我们用来接收这个指针的默认写法,例如如下这段代码并不会产生任何错误:
因此我们平时在在类内调用成员变量和方法时在其之前所写的self也是一样的道理,只是显式的表现了其私有性,例如下面这段代码也是完全正确的:
在《dive into python》中有对self的这样的描述:“在 init 方法中,self 指向新创建的对象;在其它的类方法中,它指向方法被调用的类实例”。这样做有一个好处,那就是当进行类的继承的时候,我们可以通过这种方式比较明确的知道成员变量和方法所从属的位置,也可以相对比较自由的在类内的任何位置创建局部变量或成员变量。
(本文所用资料均来源于网络)
class test: def fun(self): print("Hello") obj=test() obj.fun()
这是python中一个简单的类,如果我们删掉其中的self,会得到下面这个错误。
TypeError: fun() takes 0 positional arguments but 1 was given
这个报错给人一种分外眼熟的感觉,比如如下的代码就会得到完全相同的错误。
def fun(): print("Hello") fun("Hello")
这其实就是编译器在警告我们这里的形参数量为零,但是我们却传递了一个实参进去。然而在第一段代码中我们调用这个方法的时候,并没有传递任何实参。因此实际上是编译器在编译之前对我们的代码进行了预处理,在实参列表的最前面为我们自动加上了一个实参用来传递指针,有一点类似C中的this指针。
因此我们虽然是像:
obj.fun()
这样来调用这个方法,但实际上真正进行编译的代码类似于这样:
test.fun(obj)
因此self其实并不是一个关键字,他只是一个我们用来接收这个指针的默认写法,例如如下这段代码并不会产生任何错误:
class test: def fun(a,b): print(b) obj=test() obj.fun(10)
因此我们平时在在类内调用成员变量和方法时在其之前所写的self也是一样的道理,只是显式的表现了其私有性,例如下面这段代码也是完全正确的:
class test: def __init__(a,b): a.variable=b def fun(c,d): print(c.variable+d) obj=test(10) obj.fun(20)
在《dive into python》中有对self的这样的描述:“在 init 方法中,self 指向新创建的对象;在其它的类方法中,它指向方法被调用的类实例”。这样做有一个好处,那就是当进行类的继承的时候,我们可以通过这种方式比较明确的知道成员变量和方法所从属的位置,也可以相对比较自由的在类内的任何位置创建局部变量或成员变量。
class parent: def __init__(self): self.a=1 def multiply(self,a): return a*2 class test(parent): def __init__(self): parent.__init__(self) self.b=1 def fun(self): print(self.multiply(self.a+self.b)) object=test() object.fun()
(本文所用资料均来源于网络)
相关文章推荐
- Python Excel
- LeetCode Maximum Product Subarray
- Python核心编程 第十章练习
- python 1000创建文件夹和1000 移动文件
- Xpath简单匹配标签内容
- python通过pyhdfs连接hdfs的安装配置
- 【python gensim使用】word2vec词向量处理中文语料
- python命令行上下 退格,左右键不能用
- zeppelin下写python程序
- 【python gensim使用】word2vec词向量处理英文语料
- 地铁译:Spark for python developers ---Spark的数据戏法
- 《Python 核心编程》 学习记录
- 使用Python的urllib2和pyquery 提取深圳市太平洋影城的影讯(二)——Python代码编写
- Python 将数字以科学记数法输出
- python练习六—简单的论坛
- python str.title( )和str.istitle( )
- Python函数式编程之闭包
- python--文件操作之遍历目录
- python字符串内建函数str.index()和str.rindex()
- Python学习笔记--生成器