非凡 发表于 2021-5-29 01:01:51

pyhton 类和对象相关问题求助

在小甲鱼课时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的位置参数,这又是为什么?

对以上问题,希望有人能给我个详解

Twilight6 发表于 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,但虽然必须要你传入参数,实际上这样没什么意义

非凡 发表于 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、可是在创建类的时候,本身是没带的嘛,所以我就很迷惑,在创建类和类的实例化时,带()和不带()有什么区别。分别起什么作用?使用上有什么却别?

Twilight6 发表于 2021-5-30 11:09:06

非凡 发表于 2021-5-30 09:55
问题1还是没明白:
我复盘了下上面操作,还是没有报错。




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

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

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

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

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

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

非凡 发表于 2021-5-30 15:22:00

Twilight6 发表于 2021-5-30 11:09
那说明你没理解我后来说的 2、3、4

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


{:10_298:}这下彻悟了~非常感谢!
页: [1]
查看完整版本: pyhton 类和对象相关问题求助