huyanmin 发表于 2022-4-25 10:26:59

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

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

傻眼貓咪 发表于 2022-4-25 12:40:40

像这样?class MyClass:
        def __init__(self):
                pass
       
        def A(self):
                self.B()
       
        def B():
                pass

foo = MyClass()

huyanmin 发表于 2022-4-26 07:33:44

傻眼貓咪 发表于 2022-4-25 12:40
像这样?

为什么能调用呢?

huyanmin 发表于 2022-4-26 07:37:43

傻眼貓咪 发表于 2022-4-25 12:40
像这样?

class MyClass:
      def __init__(self):
                pass
      
      def A(self):
                self.B()
      
      def B(self):
                pass

foo = MyClass()

傻眼貓咪 发表于 2022-4-26 08:24:25

这不只是在类里面,一般都能实现的:def A():
        B()

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

A()

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

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

print("Hello World")

# 如上,只要没有调用 A() 函数,编译器是不会报错的,因为它只记录了有这个函数,其内容是等到要执行时候才看。

huyanmin 发表于 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()

傻眼貓咪 发表于 2022-4-26 10:25:55

你实例化是在第 11 行,方法 A() 在第 5 行

huyanmin 发表于 2022-4-26 13:03:54

本帖最后由 huyanmin 于 2022-4-26 13:06 编辑

傻眼貓咪 发表于 2022-4-26 10:25
你实例化是在第 11 行,方法 A() 在第 5 行

在类的里面,python解释器时怎么知道的呢?是什么机制呢?如同碰到函数时,只声明函数,而不会对函数内部的变量进行声明一样

傻眼貓咪 发表于 2022-4-26 13:37:58

huyanmin 发表于 2022-4-26 13:03
在类的里面,python解释器时怎么知道的呢?是什么机制呢?如同碰到函数时,只声明函数,而不会对函数内 ...

5 楼

huyanmin 发表于 2022-4-26 13:48:36

傻眼貓咪 发表于 2022-4-26 13:37
5 楼

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

foo = MyClass()

傻眼貓咪 发表于 2022-4-26 14:10:09

huyanmin 发表于 2022-4-26 13:48
#我的意思是当碰到类的时候,解释器声明了Myclass这个地址,为啥又声明了类里的几个函数呢

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

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

*** 以上顺序是担心你又不明白,所以用你所能理解的方式回答你。

傻眼貓咪 发表于 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

huyanmin 发表于 2022-4-26 14:30:21

傻眼貓咪 发表于 2022-4-26 14:17
就算没有实例 class,编译器还是会一行一行往下看的,如下:

你这个例子我看明白了,非常感谢,我就没有想到该这么测试

huyanmin 发表于 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()
页: [1]
查看完整版本: 请教各位老师,在python 的同一个类中,为什么定义在前面的方法可以调用后面的方法?