最近使用 python类进行编程,发现了一个有趣的东西——self。
然后我写了一个代码
类似这段代码,然后我运行python程序,就出现了下面错误:
为什么会出现 takes no arguments (1 given) 呢,问题就出现在 self。
我将上面代码的第四行
改为:
问题就解决了。
那么为什么要使用 self 呢?
python类的方法和普通的函数的一个最大的区别就是在类中的方法必须有一个额外的参数——self,而且是第一个参数。当然了,这个只是显式的表现出来,在调用的时候不必给这个参数进行赋值。
调用类方法的时候,他会默认给你的参数增加一个变量进行初始化self,这个是隐式的增加,就以我刚才的代码为例:
会自动转换为:
然后我写了一个代码
- class url():
- ...
- ...
- def portview():
- ...
- ...
-
- if __name__ == '__main__':
- address = url()
- address.portview()
![](https://i-blog.csdnimg.cn/blog_migrate/4b6e25b89a9a5dc57c574be9a2b77306.png)
为什么会出现 takes no arguments (1 given) 呢,问题就出现在 self。
我将上面代码的第四行
- def portview():
- def portview(self):
那么为什么要使用 self 呢?
python类的方法和普通的函数的一个最大的区别就是在类中的方法必须有一个额外的参数——self,而且是第一个参数。当然了,这个只是显式的表现出来,在调用的时候不必给这个参数进行赋值。
调用类方法的时候,他会默认给你的参数增加一个变量进行初始化self,这个是隐式的增加,就以我刚才的代码为例:
- address.portview()
- address.portview(url)
尽管你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数,在调用的时候我们完全不用理会这个参数。
self代表当前对象的地址。self能避免非限定调用造成的全局变量。
你一定很奇怪Python如何给self赋值以及为何你不需要给它赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self的原理了。
这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数。
给C++/Java/C#程序员的注释Python中的self等价于C++中的self指针和Java、C#中的this参考。