鱼C论坛

 找回密码
 立即注册
查看: 2730|回复: 6

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

[复制链接]
发表于 2020-12-14 16:05:35 | 显示全部楼层 |阅读模式

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

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

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是什么关系呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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) 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

您好,很感谢您的回答
您说的self.x大概明白了,但对于__init__ 还是不太明白到底是什么意思?
我找了一些例子,并结合了自己的认识,大概的理解是这样的,
__init__  是初始化的方法,在使用它时需要先有一个self(相当于规定必须有这么个玩意)...
  还是没太懂,描述不清楚,要是您方便的话,再给我细说一下吧,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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想当于将类属性转化为实例属性的意思
所以二者是有区别的
如果有帮助就给个最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

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

请问直接使用x和用self.x有什么区别吗?
--init是不是可以理解为自动调用的初始方法呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 00:54:44 | 显示全部楼层
本帖最后由 小伤口 于 2021-1-13 00:58 编辑
胖胖的小阿涵 发表于 2021-1-12 22:55
请问直接使用x和用self.x有什么区别吗?
--init是不是可以理解为自动调用的初始方法呢?


一个是类属性,一个是实例属性
__init__()里面的就是实例属性
你的意思我没听懂
反正__init__()
简单来说就是构造实例属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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不需要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 16:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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