从入门到富豪 发表于 2020-5-13 15:16:33

调用类的细节点 求解惑

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()) 这个调用后的执行顺序也不是很理解,有明白的大神知道不?

永恒的蓝色梦想 发表于 2020-5-13 15:19:28

Animal.play(())我发现这样调用也是可以的就是给self传了个元组

wp231957 发表于 2020-5-13 15:19:50

Animal.play(()) 和Animal.play() 没啥区别

wp231957 发表于 2020-5-13 15:22:27

Animal.play(Animal())等同于

a=Animal()
a.play()      
话说,下面这2个语句才是王道

qiuyouzhi 发表于 2020-5-13 15:22:47

本帖最后由 qiuyouzhi 于 2020-5-13 15:27 编辑

或许是因为括号里面的内容当成了self传递?

wp231957 发表于 2020-5-13 15:27:14

qiuyouzhi 发表于 2020-5-13 15:22
你这写法错误太多
1,Animal.play()会报错,因为play是实例的方法,不是类方法
2,括号()会当成一个参数 ...

DH116是什么鬼

qiuyouzhi 发表于 2020-5-13 15:27:47

wp231957 发表于 2020-5-13 15:27
DH116是什么鬼

魔兽世界

Twilight6 发表于 2020-5-13 15:43:35

wp231957 发表于 2020-5-13 15:27
DH116是什么鬼

逐渐偏离主题哈哈{:10_256:}

Twilight6 发表于 2020-5-13 15:52:37

第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
    def play(self):
      print(f'正在玩{self}')
输出结果会是:
正在玩()   而你那样的输出的结果是   正在玩   是因为你没有用到self参数 自然就没有影响

第一个理解的话第二个你应该也就理解了 只是把第一个 () 这个参数换成了 你的 Animal() 函数为参数 ,
输出结果是:
Animal.play(Animal())
正在玩<__main__.Animal object at 0x0000014F94C11670>
调用顺序是和第一个一样的只是第一个之前他还调用了次类对象

从入门到富豪 发表于 2020-5-13 16:38:52

Twilight6 发表于 2020-5-13 15:52
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了

输出结果会是:


第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((self)) 会报错的哦
我直接写Animal.play(),也会报错,加任何参数都不行 ,通过做实验,发现 里面的括号就相当于是类的实例化,里面的那个()= Animal()
疑问点就出来了。

Twilight6 发表于 2020-5-13 16:40:39

从入门到富豪 发表于 2020-5-13 16:38
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((sel ...

肯定会报错啊self 是参数 如果你这边直接拿来用 肯定会出现NameError

Twilight6 发表于 2020-5-13 16:42:52

本帖最后由 Twilight6 于 2020-5-13 16:45 编辑

从入门到富豪 发表于 2020-5-13 16:38
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((sel ...

你都没把类对象实例化,()不可能就突然变成类的实例化对象,而且 ()不能被实例化

_2_ 发表于 2020-5-13 16:44:28

Twilight6 发表于 2020-5-13 15:43
逐渐偏离主题哈哈

你这个狗不错

Twilight6 发表于 2020-5-13 16:45:04

_2_ 发表于 2020-5-13 16:44
你这个狗不错

{:10_327:}

从入门到富豪 发表于 2020-5-13 16:48:01

这里根据我做的实验统一说明一下:
1.直接通过 play(Animal())调用,出错, 说没有发现play,那么代表我们首先要调用类。
2. 先调用类 Animal.play到这里为止,我的理解是路径正确了, 然后后面加个(),代表调用这个函数,但是缺少实例化。 报错, 也能理解。
3.所以加上了实例化,实例化加前面我能力理解比如这样Animal().play(),但是我在验证时加到play 的括号里面也能运行 就不能理解了Animal.play(Animal())这个里面不是代表传递play的参数吗? 为啥能正常运行呢?
4.最后作了一把,删除了Animal就成这样了,Animal.play(()) ,而这个能运行我就TM 更懵逼了 啊   啊          啊啊啊啊啊啊啊。
谁能把这些理清楚啊, 我叫大爷啊。

773254968 发表于 2020-5-13 17:18:37

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()

从入门到富豪 发表于 2020-5-13 17:30:03

773254968 发表于 2020-5-13 17:18


大爷,受小弟膜拜{:5_100:}
页: [1]
查看完整版本: 调用类的细节点 求解惑