调用类的细节点 求解惑
class Animal(object):def eat(self, food):
print(f'正在吃{food}')
def play(self):
print('正在玩')
def sleep(self):
self.eat('狗粮1号')
print('正在睡觉')
调用类的时候
Animal.play(())我发现这样调用也是可以的 有谁知道为什么吗?
另外Animal.play(Animal()) 这个调用后的执行顺序也不是很理解,有明白的大神知道不? Animal.play(())我发现这样调用也是可以的就是给self传了个元组 Animal.play(()) 和Animal.play() 没啥区别 Animal.play(Animal())等同于
a=Animal()
a.play()
话说,下面这2个语句才是王道 本帖最后由 qiuyouzhi 于 2020-5-13 15:27 编辑
或许是因为括号里面的内容当成了self传递? qiuyouzhi 发表于 2020-5-13 15:22
你这写法错误太多
1,Animal.play()会报错,因为play是实例的方法,不是类方法
2,括号()会当成一个参数 ...
DH116是什么鬼 wp231957 发表于 2020-5-13 15:27
DH116是什么鬼
魔兽世界 wp231957 发表于 2020-5-13 15:27
DH116是什么鬼
逐渐偏离主题哈哈{:10_256:} 第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
def play(self):
print(f'正在玩{self}')
输出结果会是:
正在玩() 而你那样的输出的结果是 正在玩 是因为你没有用到self参数 自然就没有影响
第一个理解的话第二个你应该也就理解了 只是把第一个 () 这个参数换成了 你的 Animal() 函数为参数 ,
输出结果是:
Animal.play(Animal())
正在玩<__main__.Animal object at 0x0000014F94C11670>
调用顺序是和第一个一样的只是第一个之前他还调用了次类对象
Twilight6 发表于 2020-5-13 15:52
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
输出结果会是:
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((self)) 会报错的哦
我直接写Animal.play(),也会报错,加任何参数都不行 ,通过做实验,发现 里面的括号就相当于是类的实例化,里面的那个()= Animal()
疑问点就出来了。 从入门到富豪 发表于 2020-5-13 16:38
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((sel ...
肯定会报错啊self 是参数 如果你这边直接拿来用 肯定会出现NameError 本帖最后由 Twilight6 于 2020-5-13 16:45 编辑
从入门到富豪 发表于 2020-5-13 16:38
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((sel ...
你都没把类对象实例化,()不可能就突然变成类的实例化对象,而且 ()不能被实例化 Twilight6 发表于 2020-5-13 15:43
逐渐偏离主题哈哈
你这个狗不错 _2_ 发表于 2020-5-13 16:44
你这个狗不错
{:10_327:} 这里根据我做的实验统一说明一下:
1.直接通过 play(Animal())调用,出错, 说没有发现play,那么代表我们首先要调用类。
2. 先调用类 Animal.play到这里为止,我的理解是路径正确了, 然后后面加个(),代表调用这个函数,但是缺少实例化。 报错, 也能理解。
3.所以加上了实例化,实例化加前面我能力理解比如这样Animal().play(),但是我在验证时加到play 的括号里面也能运行 就不能理解了Animal.play(Animal())这个里面不是代表传递play的参数吗? 为啥能正常运行呢?
4.最后作了一把,删除了Animal就成这样了,Animal.play(()) ,而这个能运行我就TM 更懵逼了 啊 啊 啊啊啊啊啊啊啊。
谁能把这些理清楚啊, 我叫大爷啊。 class Animal(object):
def __init__(self):
print('__init__%', self)
def eat(self, food):
print(f'正在吃{food}')
def play(self):
print('正在玩%', self, type(self))
def sleep(self):
self.eat('狗粮1号')
print('正在睡觉')
def test():
print('test')
def main():
a = Animal() #Animal()代表创建一个Animal对象并返回
#Animal.play()#这里报错是因为,Animal类对象直接调用play方法从而缺少self参数
a.play() #但是这里调用就不会报错,因为a是Animal类的对象
#,当它调用play时会把自己当做self参数传
#小结:通过对象调用方法都会把自己当做第一个参数也就是self传
# 通过类调用就不会传参数
Animal.play(()) #这里Animal类对象直接调用play方法不会报错是因为‘()’当成一个空元组传到self
Animal.play(a)#这里不会报错,吧a传到self中
#a.test() #这里会报错,因为self参数没有人接收
Animal.test() #这里不会报错因为类直接调用的时候不会传self参数
return 0
if __name__ == '__main__':
main() 773254968 发表于 2020-5-13 17:18
大爷,受小弟膜拜{:5_100:}
页:
[1]