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的位置参数,这又是为什么?
对以上问题,希望有人能给我个详解
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,但虽然必须要你传入参数,实际上这样没什么意义 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、可是在创建类的时候,本身是没带的嘛,所以我就很迷惑,在创建类和类的实例化时,带()和不带()有什么区别。分别起什么作用?使用上有什么却别?
非凡 发表于 2021-5-30 09:55
问题1还是没明白:
我复盘了下上面操作,还是没有报错。
那说明你没理解我后来说的 2、3、4
你这里根本没有实例化对象,实例化对象需要你 “类名()”
而你这里只是给你的类取了个 myclass 的别名,这就是两者带括号与不带括号最大的区别
创建类带不带括号和你调用是否带括号完全无关
创建类时带括号,括号中是填写继承的类,而如果你不带括号默认继承 object 类
而你创建实例对象时候,带括号传入的是__init__ 设置的参数
Twilight6 发表于 2021-5-30 11:09
那说明你没理解我后来说的 2、3、4
你这里根本没有实例化对象,实例化对象需要你 “类名()”
{:10_298:}这下彻悟了~非常感谢!
页:
[1]