只爱整活周淑怡 发表于 2020-8-13 20:32:28

init 的问题求看看

是不是在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我是随便取得

zltzlt 发表于 2020-8-13 20:34:32

你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定义了一个类的实例属性 name,实例属性在类内部可以通过 self.xx 访问,在外部可以通过 类实例.xx 访问。

只爱整活周淑怡 发表于 2020-8-14 08:26:17

zltzlt 发表于 2020-8-13 20:34
你理解错了,c = name 这相当于是定义了一个局部变量 c,出了方法就不能使用了,而 self.name = name 是定 ...

self.name的self具体是指什么意思呢,是实例对象本身吗??不太理解

zltzlt 发表于 2020-8-14 08:28:48

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

是的,是类的实例对象本身

风丶少 发表于 2020-8-14 09:20:29

你只要记得,想要类里面全局都能调用就加self,只想局部调用就别加。

lhgzbxhz 发表于 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

只爱整活周淑怡 发表于 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这种的,小甲鱼好像没在视频里解释过,论坛上有详细解释吗

鱼cpython学习者 发表于 2020-8-15 20:58:02

self指的是实例对象自身的引用,所以 self.c 是一个实例对象的变量,可以在所有方法中使用。而 c 是一个局部变量,只能在__init__方法中使用,出了这个方法就不能再使用了

鱼cpython学习者 发表于 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__方法一个人的东西,其他人(方法)不能去用这两个东西。
可以理解吗?

_2_ 发表于 2020-8-15 21:10:38

类里的属性和方法在内部都是通过 self.xxx 的形式访问的

bangbang-ande 发表于 2020-8-15 21:14:20

其实self就是一个变量存储器
就像我们平时建立变量一样
但是普通的变量都是有限定的
就像函数内的变量是不可以在函数外调用的
那么就是这点,才发明了self这个存储器
用来存储变量,可以在一个类里边调用
页: [1]
查看完整版本: init 的问题求看看