首先我们要明白Python类中为什么要用self这个词,为什么不用“zhangsan”、“lisi”这样的名字,这肯定是有他的用意的。查看谷歌翻译以获得解释:
self
名词的解释:自;自我;自己
所以问题是,我在这里指的是谁?让我在下面详细分解它。
分析
测试代码基于此代码和其他扩展。首先,粘贴代码。为了更好地理解,不要说你不知道我在说什么。
class A():
def song(one):
print(one)
def sing(self,one):
print(one)
1.首先要搞清楚的问题是a=A()和a=A,这两个赋值的区别
a=A()
print(a)
a=A
print(a)
print(A)
结果如下:
<__main__.A object at 0x0000020A69C81780>
<class '__main__.A'>
<class '__main__.A'>
分析:
a=A() 是有地址的,这说明他是一个实体,比如 int a 中的 a 一样
a=A 是没有地址的,发现他和A打印的结果一毛一样,这说明他就是A,也就是一个类名,
等价于上一句中 int a 中的 int
那么也就是说下面这两语句是等价的
b=A() 与 b=a()
------------------------------------------------------------------------
通过上面的分析,我们知道,a=A()相当于把 A 给实例化了,什么叫实例化呢,类比与 int a ,
int 什么都不能做,即 int 不能被赋值,不能进行算术操作等等,但是 a 可以(其实这里的 A 与 int
是一样的,追溯到C语言,类只不过是一种自定义的结构变量而已,只不过功能更加强大)。
那具体怎么个实例发呢?
2、self 到底指代的是谁
class A():
def song(one):
print(one)
def sing(self,one):
print(one)
a=A()
A.sing(a,"hello") #注意这条语句
a.sing("hello")
打印结果:
hello
hello
-------------------------------
A.sing("hello")
错误信息:
TypeError: sing() missing 1 required positional argument: 'one'
提示没有给 one 赋值
--------------------------------
a.song("hello")
错误信息:
TypeError: song() takes 1 positional argument but 2 were given
那么问题来了,多给了一个什么参数,为什么会多给呢?
--------------------------------
把类A改一下
class A():
def song(one,two): #注意这里多给song了一个参数
print(one)
a.song("hello") //这里的参数 "hello"赋给了 two
print(a)
打印结果:
<__main__.A object at 0x0000020A69C39CC0>
<__main__.A object at 0x0000020A69C39CC0>
是不是很奇怪,为什么a.song("hello")返回的是 实例 a 的地址呢?
从这个例子中可以发现,其实a.sing("hello")等价于A.sing(a, "hello"),而self是a自身的实例,如果找到self,也可以用其他词代替。
通过这个分析,我们简单知道类中方法的第一个参数必须是self,否则实例无法正确调用类中的方法,即如果方法中的第一个参数不是self(泛化),那么这个方法没有任何价值,因为实例调用不了,调用不了的方法真的不知道有什么用。
参数前面的 self
x=6
class A():
def sing(self):
self.x=10
def mutl(self):
y=10*x
print(y)
a=A()
a.mutl()
我们先猜猜结果。它会打印 60 还是 100?要理解这个问题,首先要找出 mutl() 中的 x 是哪个,并先分析结果。
结果是:60
为什么不在类内调用 x 参数而不是在类外调用 x 呢?还是同一个问题,self指的是谁,而self是a本身,那么问题就很明显了,mutl()方法中的x前面没有self,所以他调用的不是实例(注意是一个实例,而不是类的参数)本身。
至此,我想你大概明白了,参数前面的self和no self是有区别的。简而言之,有self的参数就是实例本身,没有self的参数就是爱谁,不管实例。
self相关内容推荐阅读:
更多python学习,欢迎使用
,免费学习python,还可以观看免费视频教程。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python 视图模块(变量、函数、类)方法12/01
- ♥ 如何用python写204809/11
- ♥ python如何查看编码类型09/21
- ♥ 如何在anaconda中检查python版本08/13
- ♥ Python中的基本数据类型10/27
- ♥ 如何在 Python 中进行采样?11/05
内容反馈