鱼C论坛

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

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

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

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

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

x
是不是在init下面的变量是有要求的
class a:
    def __init__(self,name):
        self.name=name
    def kick(self):
        print('我叫%s,谁踢我' % self.name)
能够正常输出
一旦我稍微修改了一下init下的变量名就报错了
class a:
    def __init__(self,name):
        c=name
    def kick(self):
        print('我叫%s,谁踢我' % c)

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

那种不是init形式的方法好像就没有要求
class a:
    
    def kick(self,name):
        a=name
        print('我是',a)
就像这样 a我是随便取得
最佳答案
2020-8-13 20:34:32
你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定义了一个类的实例属性 name,实例属性在类内部可以通过 self.xx 访问,在外部可以通过 类实例.xx 访问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 20:34:32 | 显示全部楼层    本楼为最佳答案   
你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定义了一个类的实例属性 name,实例属性在类内部可以通过 self.xx 访问,在外部可以通过 类实例.xx 访问。
想知道小甲鱼最近在做啥?请访问 -> 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具体是指什么意思呢,是实例对象本身吗??不太理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的,是类的实例对象本身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 09:20:29 | 显示全部楼层
你只要记得,想要类里面全局都能调用就加self,只想局部调用就别加。
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

class Point():
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def getX(self):
        return self.x

    def getY(self):
        return self.y

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

    def getLen(self):
        return self.len

>>> p1 = Point(1, 1)
>>> p2 = Point(4, 5)
>>> line = Line(p1, p2)
>>> line.getLen()
5.0
就像这里为什么都是self.x,self.y这种的,小甲鱼好像没在视频里解释过,论坛上有详细解释吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 20:58:02 | 显示全部楼层
self指的是实例对象自身的引用,所以 self.c 是一个实例对象的变量,可以在所有方法中使用。而 c 是一个局部变量,只能在__init__方法中使用,出了这个方法就不能再使用了
想知道小甲鱼最近在做啥?请访问 -> 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__方法一个人的东西,其他人(方法)不能去用这两个东西。
可以理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 07:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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