鱼C论坛

 找回密码
 立即注册
查看: 3684|回复: 13

[已解决]请教各位老师,在python 的同一个类中,为什么定义在前面的方法可以调用后面的方法?

[复制链接]
发表于 2022-4-25 10:26:59 | 显示全部楼层 |阅读模式

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

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

x
请教各位老师,在python 的同一个类中,为什么定义在前面的方法可以调用后面的方法呢?
最佳答案
2022-4-26 14:17:45
本帖最后由 傻眼貓咪 于 2022-4-26 14:23 编辑
huyanmin 发表于 2022-4-26 13:48
#我的意思是当碰到类的时候,解释器声明了Myclass这个地址,为啥又声明了类里的几个函数呢


就算没有实例 class,编译器还是会一行一行往下看的,如下:
class A:
        print("看见我了 A")
        
        def __init__(self):
                print("你看不见我 X")
                self.A()
        
        def A(self):
                print("你看不见我 Y")
                self.B()
        
        def B():
                print("你看不见我 Z")
                pass
        
        print("看见我了 B")
看见我了 A
看见我了 B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-25 12:40:40 From FishC Mobile | 显示全部楼层
像这样?
class MyClass:
        def __init__(self):
                pass
        
        def A(self):
                self.B()
        
        def B():
                pass

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

使用道具 举报

 楼主| 发表于 2022-4-26 07:33:44 | 显示全部楼层

为什么能调用呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-26 07:37:43 | 显示全部楼层
class MyClass:
        def __init__(self):
                pass
        
        def A(self):
                self.B()
        
        def B(self):
                pass

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

使用道具 举报

发表于 2022-4-26 08:24:25 From FishC Mobile | 显示全部楼层
这不只是在类里面,一般都能实现的:
def A():
        B()

def B():
        print("Hello World")

A()


这是因为 Python 是解释型语言,和其它如 C/C++ 不同(需要先翻译)。那么为什么函数之间互相调用不需要先后顺序呢?

在我二楼的代码在执行的时候,程序先看见了A()的定义,记下了A(),然后又看见了B()的定义,记下了B(),再执行A()的时候,直接去找程序见过的函数了。如果调用函数的时候程序还没见过这个函数,是不能成功运行的。(程序执行的时候,读取到函数的定义的时候,这是记录下函数的名单,知道有这么些函数,但是不看函数里面的内容,当需要执行函数的时候才去读取这个函数里面的内容。)比如:
def A():
        C() # 这里故意调用不存在的函数

print("Hello World")

# 如上,只要没有调用 A() 函数,编译器是不会报错的,因为它只记录了有这个函数,其内容是等到要执行时候才看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-26 09:45:40 | 显示全部楼层
傻眼貓咪 发表于 2022-4-26 08:24
这不只是在类里面,一般都能实现的:

这是因为 Python 是解释型语言,和其它如 C/C++ 不同(需要先翻译 ...
class MyClass:
        def __init__(self):
                self.A() #实例化时自动执行__init__,直接调用了下面的A()方法,怎么解释呢?A()方法还没执行到
        
        def A(self):
                print('我是A')
        
        def B(self):
                print('我是B')

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

使用道具 举报

发表于 2022-4-26 10:25:55 From FishC Mobile | 显示全部楼层
你实例化是在第 11 行,方法 A() 在第 5 行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-26 13:03:54 | 显示全部楼层
本帖最后由 huyanmin 于 2022-4-26 13:06 编辑
傻眼貓咪 发表于 2022-4-26 10:25
你实例化是在第 11 行,方法 A() 在第 5 行


在类的里面,python解释器时怎么知道的呢?是什么机制呢?如同碰到函数时,只声明函数,而不会对函数内部的变量进行声明一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-26 13:37:58 From FishC Mobile | 显示全部楼层
huyanmin 发表于 2022-4-26 13:03
在类的里面,python解释器时怎么知道的呢?是什么机制呢?如同碰到函数时,只声明函数,而不会对函数内 ...

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

使用道具 举报

 楼主| 发表于 2022-4-26 13:48:36 | 显示全部楼层

#我的意思是当碰到类的时候,解释器声明了Myclass这个地址,为啥又声明了类里的几个函数呢
class MyClass:
        def __init__(self):
                self.A() 
        def A(self):
                print('我是A')
        
        def B(self):
                print('我是B')

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

使用道具 举报

发表于 2022-4-26 14:10:09 From FishC Mobile | 显示全部楼层
huyanmin 发表于 2022-4-26 13:48
#我的意思是当碰到类的时候,解释器声明了Myclass这个地址,为啥又声明了类里的几个函数呢

Python 是解释型语言,会一行一行往下看,也会一行一行执行。不像 C/C++ 那样,先从头到尾看过一遍确定没有问题才执行。

顺序如:
看见class -> 再看看 class 里面的内容(这里只是看,但没有要执行的意思,所以没有细看函数里面的内容) -> 实例时,执行内容函数,如 __init__(self)(这里会找回去刚才看过的内容)

*** 以上顺序是担心你又不明白,所以用你所能理解的方式回答你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-26 14:17:45 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-4-26 14:23 编辑
huyanmin 发表于 2022-4-26 13:48
#我的意思是当碰到类的时候,解释器声明了Myclass这个地址,为啥又声明了类里的几个函数呢


就算没有实例 class,编译器还是会一行一行往下看的,如下:
class A:
        print("看见我了 A")
        
        def __init__(self):
                print("你看不见我 X")
                self.A()
        
        def A(self):
                print("你看不见我 Y")
                self.B()
        
        def B():
                print("你看不见我 Z")
                pass
        
        print("看见我了 B")
看见我了 A
看见我了 B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-26 14:30:21 | 显示全部楼层
傻眼貓咪 发表于 2022-4-26 14:17
就算没有实例 class,编译器还是会一行一行往下看的,如下:

你这个例子我看明白了,非常感谢,我就没有想到该这么测试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-26 14:44:39 | 显示全部楼层
huyanmin 发表于 2022-4-26 14:30
你这个例子我看明白了,非常感谢,我就没有想到该这么测试
#通过打印后A()函数的id值为什么不一样,一个函数地址应该一样啊?
class MyClass:
        def __init__(self):
                self.A() 
        def A(self):
                print(id(self.A))
        
        def B(self):
                print('我是B')
                
a= MyClass.__dict__['A']
print(id(a))
foo = MyClass()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 02:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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