鱼C论坛

 找回密码
 立即注册
查看: 2179|回复: 6

[已解决]classmethod 调用问题

[复制链接]
发表于 2021-4-2 08:51:08 | 显示全部楼层 |阅读模式

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

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

x
正在学习类概念,自己在尝试下面代码的时候 发现出来的结果和自己想的不一样,

class A(object):
    bar = 1

    def foo(self):
        print('foo')

    @classmethod
    def class_foo(cls):
        cls.bar = 3
        print(cls.bar, cls().foo())

A.class_foo()

我以为会出来

3 foo

结果出来的是
foo
3 None

不知道有没有大哥能给帮忙解释一下,非常感谢
最佳答案
2021-4-4 10:48:28
本帖最后由 Stubborn 于 2021-4-4 10:50 编辑

你记得,调用函数,等函数运行完成才有结果
print(cls.bar, cls().foo()) 这里调用了foo()函数,那么只能等foo函数运行完成,返回结果,print才能打印结果。所以foo优先被打印出来

A.class_foo()-> print(cls.bar, cls().foo()) -> print('foo')->foo()返回None -> print(cls.bar=3, cls().foo()=None)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-2 09:20:34 | 显示全部楼层
会使用pychram吗。 会调试模式吗?
先执行的 cls().foo() 返回None
print('foo')

在执行 print(cls.bar, cls().foo())
print(cls.bar, None)
print(3, None)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-4 08:49:55 | 显示全部楼层
本帖最后由 suibian22 于 2021-4-4 09:09 编辑
Cool_Breeze 发表于 2021-4-2 09:20
会使用pychram吗。 会调试模式吗?
先执行的 cls().foo() 返回None
print('foo')


还是小白在学习,能再解释得细一点吗,非常感谢。尝试看了一下调试模式,但是也没整明白。

为什么cls(),foo()会先执行? 他不是在cls.bar后面吗? 而且他为什么会返回None?

小白从零学python,还望大佬不吝赐教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-4 10:37:03 From FishC Mobile | 显示全部楼层
suibian22 发表于 2021-4-4 08:49
还是小白在学习,能再解释得细一点吗,非常感谢。尝试看了一下调试模式,但是也没整明白。

为什么cl ...

class A(object):
  bar = 1

  def foo(self):
  print('foo')

  @classmethod
  def class_foo(cls):
  cls.bar = 3
  print(cls.bar, cls().foo())

A.class_foo()

# 1. 程序从12行开始
# 2. 到8、9行,然后到10行的print
# 3. 但是10行的print有两个参数
# 4. 要执行10行print先要获得其中两个参数值
# 5. 先获得cls.bar的值3
# 6. 再获得cls().foo()的返回值:先实例化->cls(), 再执行foo方法->foo方法打印'foo'(控制台上的第一个输出),再返回None(因为foo方法没写return默认返回None)
# 7. 这时第4步的print已经获得两个参数的值,3和None,可以执行print(3, None)->控制台第二个输出3, None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-4 10:48:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Stubborn 于 2021-4-4 10:50 编辑

你记得,调用函数,等函数运行完成才有结果
print(cls.bar, cls().foo()) 这里调用了foo()函数,那么只能等foo函数运行完成,返回结果,print才能打印结果。所以foo优先被打印出来

A.class_foo()-> print(cls.bar, cls().foo()) -> print('foo')->foo()返回None -> print(cls.bar=3, cls().foo()=None)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-4 21:20:30 | 显示全部楼层

原来是这样。非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-4 21:21:40 | 显示全部楼层
Stubborn 发表于 2021-4-4 10:48
你记得,调用函数,等函数运行完成才有结果
print(cls.bar, cls().foo()) 这里调用了foo()函数,那么只能 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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