ggn871107 发表于 2020-12-14 16:05:35

类当中的self参数、self.x 参数的疑问

求助大咖们

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

1、括号里的self是做什么用的?我自己的理解是,必须绑定有这么一个空参数,才能对其进行实例化
2、self.x 是什么意思?这样写是将变量self.x 赋值 给x 吗?那x 函数又是在哪里定义的呢?此处的self和括号里的self是什么关系呢?

小伤口 发表于 2020-12-14 16:56:35

1 __init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
2 self.x 是实例属性(self.变量名都是实例属性或实例变量)这里是将x(即__init__中的x=0)的值赋值给self.x (self.x=0) 。

ggn871107 发表于 2020-12-16 15:33:43

小伤口 发表于 2020-12-14 16:56
1 __init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性 ...

您好,很感谢您的回答
您说的self.x大概明白了,但对于__init__ 还是不太明白到底是什么意思?
我找了一些例子,并结合了自己的认识,大概的理解是这样的,
__init__是初始化的方法,在使用它时需要先有一个self(相当于规定必须有这么个玩意)...
{:9_229:}还是没太懂,描述不清楚,要是您方便的话,再给我细说一下吧,谢谢

小伤口 发表于 2020-12-16 17:30:21

self.变量名都是实例属性或实例变量
简单来说def __init__(self)
就是创建实例属性的魔法方法

举个例子:
class C:
        def __init__(self):
                self.x=2

               
>>> b=C()
>>> print(b.x)
2

class C:
        def baga(self):
                self.x=2

               
>>> b=C()
>>> print(b.x)
Traceback (most recent call last):
File "<pyshell#99>", line 1, in <module>
    print(b.x)
AttributeError: 'C' object has no attribute 'x'
为什么后者会报错呢?
先看报错内容'C' object has no attribute 'x'('C'对象没有属性'x')
所以在实例方法需要实例属性才行而实例属性就是self.变量名
我上面也说了在__init__方法内部,就可以把各种属性绑定到self。
所以def __init__(self)
就是创建实例属性的魔法方法
但你也可能会问?
class C:
        x=2
        def baga(self):
                self.x=2

               
>>> b=C()
>>> print(b.x)
2
这样又是嘛回事呀?
原因就是x=2是类属性
而self.x想当于将类属性转化为实例属性的意思
所以二者是有区别的
如果有帮助就给个最佳吧{:10_266:}

胖胖的小阿涵 发表于 2021-1-12 22:55:46

小伤口 发表于 2020-12-14 16:56
1 __init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性 ...

请问直接使用x和用self.x有什么区别吗?
--init是不是可以理解为自动调用的初始方法呢?

小伤口 发表于 2021-1-13 00:54:44

本帖最后由 小伤口 于 2021-1-13 00:58 编辑

胖胖的小阿涵 发表于 2021-1-12 22:55
请问直接使用x和用self.x有什么区别吗?
--init是不是可以理解为自动调用的初始方法呢?

一个是类属性,一个是实例属性
__init__()里面的就是实例属性
你的意思我没听懂
反正__init__()
简单来说就是构造实例属性

小伤口 发表于 2021-1-13 01:05:28

本帖最后由 小伤口 于 2021-1-13 01:07 编辑

胖胖的小阿涵 发表于 2021-1-12 22:55
请问直接使用x和用self.x有什么区别吗?
--init是不是可以理解为自动调用的初始方法呢?

>>> class A:
        x=3
        def __init__(self):
                self.y=3

               
>>> a=A
>>> a.x
3
>>> a.y
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
    a.y
AttributeError: type object 'A' has no attribute 'y'
>>> a=A()
>>> a.x
3
>>> a.y
3
>>>
给你举个例子吧
内属性和实例属性的区别
就是你说的x和self.x的区别
self.x需要实例化对象才能调用
x不需要
页: [1]
查看完整版本: 类当中的self参数、self.x 参数的疑问