鱼C论坛

 找回密码
 立即注册
查看: 824|回复: 17

[已解决]调用类的细节点 求解惑

[复制链接]
发表于 2020-5-13 15:16:33 | 显示全部楼层 |阅读模式

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

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

x
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 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-13 15:19:28 | 显示全部楼层
Animal.play(())  我发现这样调用也是可以的
就是给self传了个元组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 15:19:50 | 显示全部楼层
Animal.play(()) 和Animal.play() 没啥区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 15:22:27 | 显示全部楼层
Animal.play(Animal())等同于

a=Animal()
a.play()        
话说,下面这2个语句才是王道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 15:22:47 | 显示全部楼层
本帖最后由 qiuyouzhi 于 2020-5-13 15:27 编辑

或许是因为括号里面的内容当成了self传递?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

DH116是什么鬼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 15:27:47 | 显示全部楼层

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

使用道具 举报

发表于 2020-5-13 15:43:35 | 显示全部楼层

逐渐偏离主题  哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 15:52:37 | 显示全部楼层
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
    def play(self):
        print(f'正在玩{self}')
输出结果会是:
正在玩()   而你那样的输出的结果是     正在玩   是因为你没有用到self参数 自然就没有影响

第一个理解的话  第二个你应该也就理解了 只是把第一个 () 这个参数换成了 你的 Animal() 函数为参数 ,  
输出结果是  :
Animal.play(Animal())
正在玩<__main__.Animal object at 0x0000014F94C11670>
调用顺序是和第一个一样的  只是第一个之前他还调用了次类对象  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

输出结果会是:

第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((self)) 会报错的哦
我直接写Animal.play(),也会报错,加任何参数都不行 ,通过做实验,发现 里面的括号就相当于是类的实例化,里面的那个()= Animal()
疑问点就出来了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

肯定会报错啊  self 是参数 如果你这边直接拿来用 肯定会出现NameError
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 16:42:52 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-13 16:45 编辑
从入门到富豪 发表于 2020-5-13 16:38
第一个问题是因为他把括号当成self参数了,你试着把这里改改就看的出来了
但是我直接写Animal.play((sel ...


你都没把类对象实例化,()不可能就突然变成类的实例化对象,而且 ()不能被实例化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 16:44:28 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-5-13 15:43
逐渐偏离主题  哈哈

你这个狗不错[doge]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 16:45:04 | 显示全部楼层
_2_ 发表于 2020-5-13 16:44
你这个狗不错[doge]

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

使用道具 举报

 楼主| 发表于 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 更懵逼了 啊   啊          啊  啊啊啊啊啊啊。
谁能把这些理清楚啊, 我叫大爷啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-5-13 17:30:03 | 显示全部楼层

大爷,受小弟膜拜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 09:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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