鱼C论坛

 找回密码
 立即注册
查看: 1916|回复: 7

[已解决]关于类的self变量是否必要的疑问

[复制链接]
发表于 2022-5-29 19:08:33 | 显示全部楼层 |阅读模式

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

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

x
求助!
小甲鱼在python入门课里面讲到,class类必须有self这个参量,否则python不知道是哪一个对象在调用这个方法.可是我觉得不用self,依然可以是哪个对象在调用这个方法。
举个例子
Class A:
        def ini(self)
A_1 = A()
A_2=A()
调用方法的时候
A_1.ini()
A_2.ini()
python可以通过x.ini() 的x来识别是x调用此方法呀
求大神赐教!!!!
最佳答案
2022-5-29 19:37:11
本帖最后由 isdkz 于 2022-5-29 19:38 编辑

你在定义这个类的时候并不知道类会实例化成什么实例名呀,

如果类的方法需要用到自己的属性应该怎么定义呢?

假如你知道你的 A 类的 a 方法需要使用自己的属性,且 A 会实例化成 a1,

你可以这样定义:

>>> class A:
...     @staticmethod
...     def a():
...         print(a1.test)
...
>>> a1 = A()
>>> a1.test = 89
>>> a1.a()
89
>>>


但这有一个问题,这对 a1 来说是访问自己的属性,那对其它实例来说呢,

>>> a2 = A()
>>> a2.test = 698
>>> a2.a()
89
>>>


可以看到对 a2 来说,a 方法里面访问的还是 a1 的属性,而不是自己的,

所以这个“自己”不能在类中写死,而在类的方法中又需要访问自己的属性,

只有动态传参可以做到,也就是第一个参数 self,而这个 self 解释器会帮我们自动传入调用方法的实例,

所以 self 非常必要:

>>> class A:
...     def a(self):
...         print(self.test)
...
>>> a1 = A()
>>> a1.test = 89
>>> a1.a()
89
>>> a2 = A()
>>> a2.test = 698
>>> a2.a()
698
>>>


注:我前面的演示代码中用了 @staticmethod 是为了不让解释器自动把调用方法的实例传入,

因为如果解释器默认自动传入了,而方法中没有接收的参数会导致程序出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-29 19:30:45 | 显示全部楼层
本帖最后由 jackz007 于 2022-5-29 19:32 编辑

        类是设计图,对象是产品,用同一张设计图可以制造很多相同的产品,虽然设计图相同,但是,产品个体还是需要区别的,self 就是产品个体的身份证,只有知道了身份证,生产线才能知道自己正在加工哪一个产品。对象在调用自己方法的时候,必须要先呈上自己的身份信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-29 19:37:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-5-29 19:38 编辑

你在定义这个类的时候并不知道类会实例化成什么实例名呀,

如果类的方法需要用到自己的属性应该怎么定义呢?

假如你知道你的 A 类的 a 方法需要使用自己的属性,且 A 会实例化成 a1,

你可以这样定义:

>>> class A:
...     @staticmethod
...     def a():
...         print(a1.test)
...
>>> a1 = A()
>>> a1.test = 89
>>> a1.a()
89
>>>


但这有一个问题,这对 a1 来说是访问自己的属性,那对其它实例来说呢,

>>> a2 = A()
>>> a2.test = 698
>>> a2.a()
89
>>>


可以看到对 a2 来说,a 方法里面访问的还是 a1 的属性,而不是自己的,

所以这个“自己”不能在类中写死,而在类的方法中又需要访问自己的属性,

只有动态传参可以做到,也就是第一个参数 self,而这个 self 解释器会帮我们自动传入调用方法的实例,

所以 self 非常必要:

>>> class A:
...     def a(self):
...         print(self.test)
...
>>> a1 = A()
>>> a1.test = 89
>>> a1.a()
89
>>> a2 = A()
>>> a2.test = 698
>>> a2.a()
698
>>>


注:我前面的演示代码中用了 @staticmethod 是为了不让解释器自动把调用方法的实例传入,

因为如果解释器默认自动传入了,而方法中没有接收的参数会导致程序出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-29 20:37:22 | 显示全部楼层
jackz007 发表于 2022-5-29 19:30
类是设计图,对象是产品,用同一张设计图可以制造很多相同的产品,虽然设计图相同,但是,产品个体 ...

先声明一下,完全不是砸场子啊!只是为了更好的学习!
强烈建议你听一下B站上杨淑娟(娟姐)将的关于类的几节课。虽然很多部分娟姐讲的不如小甲鱼详细,但个人认为类这部分讲的很清楚。你看完以后就能明白了!
在python中万物皆对象,对象的三要素是:ID,,type和value,弄懂了类对象和实例对象以及浅拷贝和深拷贝估计你的问题就无师自通了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-29 20:55:26 | 显示全部楼层
67193114 发表于 2022-5-29 20:37
先声明一下,完全不是砸场子啊!只是为了更好的学习!
强烈建议你听一下B站上杨淑娟(娟姐)将的关于类 ...

        你这是在给我上课?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-29 21:27:46 | 显示全部楼层
isdkz 发表于 2022-5-29 19:37
你在定义这个类的时候并不知道类会实例化成什么实例名呀,

如果类的方法需要用到自己的属性应该怎么定义 ...

懂啦~感谢感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-29 21:28:22 | 显示全部楼层
jackz007 发表于 2022-5-29 19:30
类是设计图,对象是产品,用同一张设计图可以制造很多相同的产品,虽然设计图相同,但是,产品个体 ...

懂啦~谢谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-30 11:49:27 | 显示全部楼层
jackz007 发表于 2022-5-29 20:55
你这是在给我上课?

不敢不敢!头像都一样,引用错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 01:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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