鱼C论坛

 找回密码
 立即注册
查看: 1969|回复: 10

[已解决]init 的问题求看看

[复制链接]
发表于 2020-8-13 20:32:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
是不是在init下面的变量是有要求的
  1. class a:
  2.     def __init__(self,name):
  3.         self.name=name
  4.     def kick(self):
  5.         print('我叫%s,谁踢我' % self.name)

复制代码
能够正常输出
一旦我稍微修改了一下init下的变量名就报错了
  1. class a:
  2.     def __init__(self,name):
  3.         c=name
  4.     def kick(self):
  5.         print('我叫%s,谁踢我' % c)
复制代码


是不是都必须得以self.xx来命名啊,我一直以为变量名是随便取的。。。

那种不是init形式的方法好像就没有要求
  1. class a:
  2.    
  3.     def kick(self,name):
  4.         a=name
  5.         print('我是',a)
复制代码

就像这样 a我是随便取得
最佳答案
2020-8-13 20:34:32
你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定义了一个类的实例属性 name,实例属性在类内部可以通过 self.xx 访问,在外部可以通过 类实例.xx 访问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 20:34:32 | 显示全部楼层    本楼为最佳答案   
你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定义了一个类的实例属性 name,实例属性在类内部可以通过 self.xx 访问,在外部可以通过 类实例.xx 访问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-14 08:26:17 | 显示全部楼层
zltzlt 发表于 2020-8-13 20:34
你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定 ...

self.name的self具体是指什么意思呢,是实例对象本身吗??不太理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 08:28:48 | 显示全部楼层
只爱整活周淑怡 发表于 2020-8-14 08:26
self.name的self具体是指什么意思呢,是实例对象本身吗??不太理解

是的,是类的实例对象本身
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 09:20:29 | 显示全部楼层
你只要记得,想要类里面全局都能调用就加self,只想局部调用就别加。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 11:20:51 | 显示全部楼层
只爱整活周淑怡 发表于 2020-8-14 08:26
self.name的self具体是指什么意思呢,是实例对象本身吗??不太理解

如果是a.__init__,那么self就是a,self.name就是a.name
如果是b.__init__,那么self就是b,self.name就是b.name
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-14 12:46:49 | 显示全部楼层
zltzlt 发表于 2020-8-13 20:34
你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定 ...

这有点太抽象了还是没整明白
  1. import math

  2. class Point():
  3.     def __init__(self, x=0, y=0):
  4.         self.x = x
  5.         self.y = y

  6.     def getX(self):
  7.         return self.x

  8.     def getY(self):
  9.         return self.y

  10. class Line():
  11.     def __init__(self, p1, p2):
  12.         self.x = p1.getX() - p2.getX()
  13.         self.y = p1.getY() - p2.getY()
  14.         self.len = math.sqrt(self.x*self.x + self.y*self.y)

  15.     def getLen(self):
  16.         return self.len

  17. >>> p1 = Point(1, 1)
  18. >>> p2 = Point(4, 5)
  19. >>> line = Line(p1, p2)
  20. >>> line.getLen()
  21. 5.0
复制代码

就像这里为什么都是self.x,self.y这种的,小甲鱼好像没在视频里解释过,论坛上有详细解释吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 20:58:02 | 显示全部楼层
self指的是实例对象自身的引用,所以 self.c 是一个实例对象的变量,可以在所有方法中使用。而 c 是一个局部变量,只能在__init__方法中使用,出了这个方法就不能再使用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 21:04:09 | 显示全部楼层
只爱整活周淑怡 发表于 2020-8-14 12:46
这有点太抽象了还是没整明白
就像这里为什么都是self.x,self.y这种的,小甲鱼好像没在视频里解释过,论 ...

self.x和self.y是实例对象的变量,所以他们可以被任何方法访问和更改。
如果换成x和y,其他方法就不能去访问和更改了。
你可以这样理解:
类是一个大家庭,里面有很多方法,包括__init__。
self.x和self.y是这个家庭里所有人(方法)共有的东西,每个人(方法)都可以去使用这两个东西。
但如果是x和y,他们就是__init__方法一个人的东西,其他人(方法)不能去用这两个东西。
可以理解吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 21:10:38 From FishC Mobile | 显示全部楼层
类里的属性和方法在内部都是通过 self.xxx 的形式访问的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 21:14:20 | 显示全部楼层
其实self就是一个变量存储器
就像我们平时建立变量一样
但是普通的变量都是有限定的
就像函数内的变量是不可以在函数外调用的
那么就是这点,才发明了self这个存储器
用来存储变量,可以在一个类里边调用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-25 18:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表