鱼C论坛

 找回密码
 立即注册
查看: 1035|回复: 9

[已解决]大神看过来~~第42课时课堂练习的求教~

[复制链接]
发表于 2018-4-26 14:58:32 | 显示全部楼层 |阅读模式
5鱼币
class new_int(int):
     def __add__(self,other):
         return int.__sub__(self,other)
     def __sub__(self,other):
         return int.__add__(self,other)
请问在这个类中,为什么当return int.__sub__(self.other) 没有引起无限递归呢,下面不是定义了新的__sub__函数了吗,然后再return int.__add__(self,other)
最佳答案
2018-4-26 14:58:33
模return的是int的函数,而不是new_int的函数,当然不会无限递归

最佳答案

查看完整内容

模return的是int的函数,而不是new_int的函数,当然不会无限递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-26 14:58:33 | 显示全部楼层    本楼为最佳答案   
模return的是int的函数,而不是new_int的函数,当然不会无限递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-26 15:26:08 | 显示全部楼层
本帖最后由 ABC23 于 2018-4-26 16:06 编辑

递归是自己调用自己,这里调用new_int的父类方法,不属于本类方法,故不是递归(这是定义)。
====================================================
BUT!定义是不完美的,除了自己调用自己,要增加函数调用栈的深度,还可以这样——函数间的循环调用!

public class Bar{

        void f(){
                g();
        }

        void g(){
                f();
        }


        public static void main(String[] args) {
                new Bar().f();
                // new Bar().g();
        }
}

用Java写的,明白这么回事就可以了。( 抛出java.lang.StackOverflowError)


但是,但是!Python和Java不一样,循环引用函数通常并不会增加额外的函数调用栈的深度,请看下面的例子。

>>> class Demo:
        def f(self):
                return g()
        def g(self):
                return f()

       
>>> d = Demo()
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'f', 'g']
>>> d.f()
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    d.f()
  File "<pyshell#20>", line 3, in f
    return g()
NameError: name 'g' is not defined
>>> d.g()
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    d.g()
  File "<pyshell#20>", line 5, in g
    return f()
NameError: name 'f' is not defined
>>>

它只是说【函数未定义】,为什么呢,因为Python是动态语言,在进行时动态解释,首先加载f,运行中调用g就去找g。这个顺序和执行的顺序有关而和代码的摆放位置没有直接关系。
但是Java,是静态语言,代码写好了要编译的。不管你要不要运行加载f、g,都给你先加载着再说。

>>> from dis import dis
>>> dis(f)
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    dis(f)
NameError: name 'f' is not defined
>>> dis(g)
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    dis(g)
NameError: name 'g' is not defined
>>>

想要得到f、g的字节码?不可能的!这并不是无限递归引起的异常,而是根本没有定义!这一点也可以看出,Python是一个解释语言。无误。


你说的问题属于函数间的相互引用,但是要分清具体语言,在Python中这是行不通的


ps. 上面的例子Java换成C,也许更有说服力

pps. 补充,Python说不能实现函数循环引用,仅仅是针对类而言(方法),如果出了类,作为【一等公民】的Python函数,还是可以实现无穷引用的。
>>> def f():
                g()

       
>>> def g():
                f()

       
>>> from dis import dis
>>> dis(f)
  2           0 LOAD_GLOBAL              0 (g)
              2 CALL_FUNCTION            0
              4 POP_TOP
              6 LOAD_CONST               0 (None)
              8 RETURN_VALUE
>>> dis(g)
  2           0 LOAD_GLOBAL              0 (f)
              2 CALL_FUNCTION            0
              4 POP_TOP
              6 LOAD_CONST               0 (None)
              8 RETURN_VALUE
>>>

这就不是未定义了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-26 16:25:17 | 显示全部楼层
BngThea 发表于 2018-4-26 15:49
模return的是int的函数,而不是new_int的函数,当然不会无限递归

换言之,return __sub__(self,other) 和下面的 def中的 __sub__(self,ohter),这两个并不是一回事是吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-26 16:26:42 | 显示全部楼层
ABC23 发表于 2018-4-26 15:26
递归是自己调用自己,这里调用new_int的父类方法,不属于本类方法,故不是递归(这是定义)。
=========== ...

兄逮,非常感谢你打了这么多字,但是你这又是python,又是java的,更搞得我云里雾里了,所以最佳答案就不嫩给你了啊,不好意思,非常感谢你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-26 16:31:36 | 显示全部楼层
本帖最后由 月引流光 于 2018-4-26 16:33 编辑

11:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-26 16:33:18 | 显示全部楼层
BngThea 发表于 2018-4-26 15:49
模return的是int的函数,而不是new_int的函数,当然不会无限递归
月引流光 发表于 2018-4-26 16:25
换言之,return __sub__(self,other) 和下面的 def中的 __sub__(self,ohter),这两个并不是一回事是吧?


大神,麻烦您再看下我这段代码,42课时课后练习动动手第一个,就是两个字符串相减的那个例子
class Nstr(str):
    def __sub__(self,other):
        for i in self:
            if i in other:
                self.replace(i,'')
我的本意呢,是当 other 中有的每一个字符如果在self中也有的话就全部替换
举个例子如果a = 'aaaaabbbbb', b = 'ab'  然后 a- b 应该得到是‘’就是ab全部被去掉,您看看我这段代码怎么改,谢谢了{:10_282
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-26 16:46:05 | 显示全部楼层
月引流光 发表于 2018-4-26 16:25
换言之,return __sub__(self,other) 和下面的 def中的 __sub__(self,ohter),这两个并不是一回事是吧?

当然不是一回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-26 16:51:30 | 显示全部楼层
月引流光 发表于 2018-4-26 16:33
大神,麻烦您再看下我这段代码,42课时课后练习动动手第一个,就是两个字符串相减的那个例子
class  ...

把self.replace(i,'')
改成
self = self.replace(i,'')
试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-26 17:01:45 | 显示全部楼层
BngThea 发表于 2018-4-26 16:51
把self.replace(i,'')
改成
self = self.replace(i,'')

perfect!!!!最佳答案就是您了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 18:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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