鱼C论坛

 找回密码
 立即注册
查看: 1978|回复: 11

[已解决]Python中魔法方法中return和print的选用。

[复制链接]
发表于 2020-3-10 21:51:09 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 sYMMetrY 于 2020-3-10 22:29 编辑
#程序一:

class Const:
    l = []
    def __setattr__(self,name,value):
        if name.isupper():
            if name not in self.l:
                self.l.append(name)
                super().__setattr__(name,value)
            else:
                print('常量无法改变!')
            
        else:
            print('常量名必须由大写字母组成!')

#程序二:

class Const:
    l = []
    def __setattr__(self,name,value):
        if name.isupper():
            if name not in self.l:
                self.l.append(name)
                super().__setattr__(name,value)
            else:
                return('常量无法改变!')
            
        else:
            return('常量名必须由大写字母组成!')

#运行结果一

>>> c = Const()
>>> c.N = 2
>>> c.N
2
>>> c.N=3
常量无法改变!
>>> c.N
2   

#运行结果二
>>> c = Const()
>>> c.N = 2
>>> c.N = 3
#未出现<font color="Red">'常量无法改变!'</font>的提示句子
>>> c.N
2
这种区别在不同的魔法方法中的体现是不一样的,有时表现相同,有时有差别(如本例),这是为什么呢?不同魔法方法使用该如何明辨选用return还是print?

最佳答案
2020-3-11 16:02:38
sYMMetrY 发表于 2020-3-11 14:47
不应该是这个原因,如果把定义的函数放在py文件,利用idle调用同样也是这个结果。

你在 IDLE 里调用不就是在 shell 里输入的吗!
在 IDLE 的交互模式下,也就是一打开看见的,
敲了变量或函数时会在屏幕上显示,如果在编程的时候,没有 print 是不会输出的。
你要喊不动可以看一下下面的例子:
def f():
        return 0

f()
你把代码保存成文件,用 IDLE 打开运行后会发现并没有输出 0,
并且 return 会返回当前的函数并结束函数
返回函数,那就可以用赋值给一个变量,
像刚才的例子,如果在添一句 v = f()
那 v 就是 return 后的值。

如果用 print 就不会返回函数,也不会结束函数
例如刚才的例子,把 return 改成 print,
你会发现 v 变量 None ,没有返回。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-10 22:09:44 From FishC Mobile | 显示全部楼层
print不是返回
return则表明我这个函数是具备返回值的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-10 22:28:21 | 显示全部楼层
wp231957 发表于 2020-3-10 22:09
print不是返回
return则表明我这个函数是具备返回值的
>>> def f():
        return 1

>>> f()
1
>>> def f():
        print(1)

        
>>> f()
1
我还是不太明白为何在这个例子中为何使用return之后,不能出现返回值,就好比这个像这个例子一样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 22:35:37 From FishC Mobile | 显示全部楼层
sYMMetrY 发表于 2020-3-10 22:28
我还是不太明白为何在这个例子中为何使用return之后,不能出现返回值,就好比这个像这个例子一样?

shell比较特殊,你在敲变量时,它会自动在屏幕上输出,而实际编程时,如果没有print是不会有输出的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 22:41:47 | 显示全部楼层
学到魔法函数这里了,还没有分清楚这两个的区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-11 09:10:14 | 显示全部楼层
选择需谨慎,有的魔法方法不能return,如__init__,如果你return就会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-11 14:44:00 | 显示全部楼层
wuqramy 发表于 2020-3-11 09:10
选择需谨慎,有的魔法方法不能return,如__init__,如果你return就会报错

是的,您说的很对。但是像__setattr__()用了return不会在shell中返回‘值’这类现象,是有规律可循的吗?这个的机制还是不太了解?还希望知道的话指教一下~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-11 14:47:33 | 显示全部楼层
wp231957 发表于 2020-3-10 22:35
shell比较特殊,你在敲变量时,它会自动在屏幕上输出,而实际编程时,如果没有print是不会有输出的

不应该是这个原因,如果把定义的函数放在py文件,利用idle调用同样也是这个结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-11 14:50:17 | 显示全部楼层
本帖最后由 wuqramy 于 2020-3-11 14:51 编辑
sYMMetrY 发表于 2020-3-11 14:44
是的,您说的很对。但是像__setattr__()用了return不会在shell中返回‘值’这类现象,是有规律 ...


我目前只了解__init__不能return...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-11 16:02:38 | 显示全部楼层    本楼为最佳答案   
sYMMetrY 发表于 2020-3-11 14:47
不应该是这个原因,如果把定义的函数放在py文件,利用idle调用同样也是这个结果。

你在 IDLE 里调用不就是在 shell 里输入的吗!
在 IDLE 的交互模式下,也就是一打开看见的,
敲了变量或函数时会在屏幕上显示,如果在编程的时候,没有 print 是不会输出的。
你要喊不动可以看一下下面的例子:
def f():
        return 0

f()
你把代码保存成文件,用 IDLE 打开运行后会发现并没有输出 0,
并且 return 会返回当前的函数并结束函数
返回函数,那就可以用赋值给一个变量,
像刚才的例子,如果在添一句 v = f()
那 v 就是 return 后的值。

如果用 print 就不会返回函数,也不会结束函数
例如刚才的例子,把 return 改成 print,
你会发现 v 变量 None ,没有返回。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +1 收起 理由
sYMMetrY + 3 + 3 + 1 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-11 16:47:07 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-3-11 16:49 编辑
lixiangyv 发表于 2020-3-11 16:02
你在 IDLE 里调用不就是在 shell 里输入的吗!
在 IDLE 的交互模式下,也就是一打开看见的,
敲了变量 ...

感谢您的讲解,我对这块了解更深刻了一些!但是还有个疑问,如下图:
微信图片_20200311163645.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 19:57:43 | 显示全部楼层
魔法方法 __setattr__ 是不能有返回值的,
所以第二个例子没有打印 '常量名必须有大写字母组成!'

评分

参与人数 1荣誉 +1 鱼币 +3 贡献 +2 收起 理由
sYMMetrY + 1 + 3 + 2 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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