请教各位老师,在python 的同一个类中,为什么定义在前面的方法可以调用后面的方法?
请教各位老师,在python 的同一个类中,为什么定义在前面的方法可以调用后面的方法呢? 像这样?class MyClass:def __init__(self):
pass
def A(self):
self.B()
def B():
pass
foo = MyClass() 傻眼貓咪 发表于 2022-4-25 12:40
像这样?
为什么能调用呢? 傻眼貓咪 发表于 2022-4-25 12:40
像这样?
class MyClass:
def __init__(self):
pass
def A(self):
self.B()
def B(self):
pass
foo = MyClass() 这不只是在类里面,一般都能实现的:def A():
B()
def B():
print("Hello World")
A()
这是因为 Python 是解释型语言,和其它如 C/C++ 不同(需要先翻译)。那么为什么函数之间互相调用不需要先后顺序呢?
在我二楼的代码在执行的时候,程序先看见了A()的定义,记下了A(),然后又看见了B()的定义,记下了B(),再执行A()的时候,直接去找程序见过的函数了。如果调用函数的时候程序还没见过这个函数,是不能成功运行的。(程序执行的时候,读取到函数的定义的时候,这是记录下函数的名单,知道有这么些函数,但是不看函数里面的内容,当需要执行函数的时候才去读取这个函数里面的内容。)比如:def A():
C() # 这里故意调用不存在的函数
print("Hello World")
# 如上,只要没有调用 A() 函数,编译器是不会报错的,因为它只记录了有这个函数,其内容是等到要执行时候才看。 傻眼貓咪 发表于 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() 你实例化是在第 11 行,方法 A() 在第 5 行 本帖最后由 huyanmin 于 2022-4-26 13:06 编辑
傻眼貓咪 发表于 2022-4-26 10:25
你实例化是在第 11 行,方法 A() 在第 5 行
在类的里面,python解释器时怎么知道的呢?是什么机制呢?如同碰到函数时,只声明函数,而不会对函数内部的变量进行声明一样 huyanmin 发表于 2022-4-26 13:03
在类的里面,python解释器时怎么知道的呢?是什么机制呢?如同碰到函数时,只声明函数,而不会对函数内 ...
5 楼 傻眼貓咪 发表于 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() huyanmin 发表于 2022-4-26 13:48
#我的意思是当碰到类的时候,解释器声明了Myclass这个地址,为啥又声明了类里的几个函数呢
Python 是解释型语言,会一行一行往下看,也会一行一行执行。不像 C/C++ 那样,先从头到尾看过一遍确定没有问题才执行。
顺序如:
看见class -> 再看看 class 里面的内容(这里只是看,但没有要执行的意思,所以没有细看函数里面的内容) -> 实例时,执行内容函数,如 __init__(self)(这里会找回去刚才看过的内容)
*** 以上顺序是担心你又不明白,所以用你所能理解的方式回答你。 本帖最后由 傻眼貓咪 于 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 傻眼貓咪 发表于 2022-4-26 14:17
就算没有实例 class,编译器还是会一行一行往下看的,如下:
你这个例子我看明白了,非常感谢,我就没有想到该这么测试 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]