鱼C论坛

 找回密码
 立即注册
查看: 1926|回复: 4

[已解决]pyhton 类和对象相关问题求助

[复制链接]
发表于 2021-5-29 01:01:51 | 显示全部楼层 |阅读模式

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

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

x
在小甲鱼课时38讲,

测试题-0 说代码会报错,
class MyClass:
        def __init__(self):
                return "I love FishC.com!"
因为 __init__ 特殊方法不应当返回除了 None 以外的任何对象。

1、可是我执行的时候,也没报错啊,这时为什么?
class MyClass:
    def __init__(self):
        return "I love FishC.com!"
    
>>>myclass.__init__('')
'I love FishC.com!'
>>>myclass.__init__
<function MyClass.__init__ at 0x0000020C311719D8>

2、看视频和练习题里,有的时候创建类的时候,类名后面会带()有的时候也不带。为什么?有区别吗?

3、在实例类的时候,类名后面带()和不带()有什么区别?
同测试题-0,小甲鱼答案实例类时带了()所以报错了,而我没有带()

4、还有如果实例类的时候,不带(),在引用类中方法时一定要带self的位置参数,这又是为什么?

对以上问题,希望有人能给我个详解
最佳答案
2021-5-29 10:31:31

1、可是我执行的时候,也没报错啊,这时为什么?


你执行的不是重写的 MyClass 类,从你代码中都没看见 MyClass 类重新实例化

应该是因为你之前实例化过了赋值给了 myclass,所以此时你调用的不是你重写后的

而如果你重写了 __init__ ,返回值不为 None,那么你实例化过程就会报错,根本无法成功实例化对象

2、看视频和练习题里,有的时候创建类的时候,类名后面会带()有的时候也不带。为什么?有区别吗?


Python2 之前好像是有区分的,但 Python3 之后若不继承类,一般创建新类时可以不用带上(),因为默认继承 object 类,即基类

3、在实例类的时候,类名后面带()和不带()有什么区别?
同测试题-0,小甲鱼答案实例类时带了()所以报错了,而我没有带()

应该没有称为实例类的对象吧,要么称为类,要么称类的实例。

在类名后面带上括号,一般是指实例化类对象,将创建个实例,并赋值给变量

而不带括号就是指这个类整体,一般需要给类取别名时候才不带括号

4、还有如果实例类的时候,不带(),在引用类中方法时一定要带self的位置参数,这又是为什么?


因为实例化类时,你实例的变量本身就是 self,举个例子: a = A()  此时创建了 A 类,对于 a 实例对象而言,该对象中的 self 就是指它自己本身,即 self -> a

所以你实例化对象后不需要传入 self 参数,因为默认指实例本身。

而若你没有实例化对象,那么 self 参数就相当于没有值,但是 self 参数本身还在类中,此时就必须传入一个值来赋予 self,但虽然必须要你传入参数,实际上这样没什么意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-29 10:31:31 | 显示全部楼层    本楼为最佳答案   

1、可是我执行的时候,也没报错啊,这时为什么?


你执行的不是重写的 MyClass 类,从你代码中都没看见 MyClass 类重新实例化

应该是因为你之前实例化过了赋值给了 myclass,所以此时你调用的不是你重写后的

而如果你重写了 __init__ ,返回值不为 None,那么你实例化过程就会报错,根本无法成功实例化对象

2、看视频和练习题里,有的时候创建类的时候,类名后面会带()有的时候也不带。为什么?有区别吗?


Python2 之前好像是有区分的,但 Python3 之后若不继承类,一般创建新类时可以不用带上(),因为默认继承 object 类,即基类

3、在实例类的时候,类名后面带()和不带()有什么区别?
同测试题-0,小甲鱼答案实例类时带了()所以报错了,而我没有带()

应该没有称为实例类的对象吧,要么称为类,要么称类的实例。

在类名后面带上括号,一般是指实例化类对象,将创建个实例,并赋值给变量

而不带括号就是指这个类整体,一般需要给类取别名时候才不带括号

4、还有如果实例类的时候,不带(),在引用类中方法时一定要带self的位置参数,这又是为什么?


因为实例化类时,你实例的变量本身就是 self,举个例子: a = A()  此时创建了 A 类,对于 a 实例对象而言,该对象中的 self 就是指它自己本身,即 self -> a

所以你实例化对象后不需要传入 self 参数,因为默认指实例本身。

而若你没有实例化对象,那么 self 参数就相当于没有值,但是 self 参数本身还在类中,此时就必须传入一个值来赋予 self,但虽然必须要你传入参数,实际上这样没什么意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-30 09:55:39 | 显示全部楼层
Twilight6 发表于 2021-5-29 10:31
你执行的不是重写的 MyClass 类,从你代码中都没看见 MyClass 类重新实例化

应该是因为你之前实例 ...

问题1还是没明白:
我复盘了下上面操作,还是没有报错。
class MyClass:
    def __init__(self):
        return "I love FishC.com!"
>>>myclass = MyClass
>>>myclass.__init__('')
'I love FishC.com!'
>>>myclass.__init__
<function MyClass.__init__ at 0x000002B76E2CBF78>

但是我在这样做类重新实例化时就报错了
>>>myclass = MyClass()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: __init__() should return None, not 'str'

区别就是在类名后面带了()
1、这是为什么?
2、可是在创建类的时候,本身是没带的嘛,所以我就很迷惑,在创建类和类的实例化时,带()和不带()有什么区别。分别起什么作用?使用上有什么却别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-30 11:09:06 | 显示全部楼层
非凡 发表于 2021-5-30 09:55
问题1还是没明白:
我复盘了下上面操作,还是没有报错。


那说明你没理解我后来说的 2、3、4

你这里根本没有实例化对象,实例化对象需要你 “类名()”

而你这里只是给你的类取了个 myclass 的别名,这就是两者带括号与不带括号最大的区别

创建类带不带括号和你调用是否带括号完全无关

创建类时带括号,括号中是填写继承的类,而如果你不带括号默认继承 object 类

而你创建实例对象时候,带括号传入的是__init__ 设置的参数

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

使用道具 举报

 楼主| 发表于 2021-5-30 15:22:00 | 显示全部楼层
Twilight6 发表于 2021-5-30 11:09
那说明你没理解我后来说的 2、3、4

你这里根本没有实例化对象,实例化对象需要你 “类名()”

这下彻悟了~非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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