gpt4 book ai didi

类内函数的 Python 前向声明

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:12 25 4
gpt4 key购买 nike

我第一次接触 Python,但我被困在这里:

class A:
def __init__(self):
a = foo("baa")

class B(A):
b = foo("boo")

def foo(string):
return string

此时我加载了上面的文件(名为 classes)并且发生了这种情况:

$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from classes import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "classes.py", line 5, in <module>
class B(A):
File "classes.py", line 6, in B
b = foo("boo")
NameError: name 'foo' is not defined

请注意 B 类中的错误,其中 foo 是直接调用的,而不是从 __init__ 调用的。另请注意我还没有实例化类 B

第一个问题:

  • 为什么返回错误?我没有实例化一个类。

继续前进。 “问题”通过将 foo() 的定义移动到上面几行来解决:

def foo(string):
return string

class A:
def __init__(self):
a = foo("baa")

class B(A):
b = foo("boo")

现在我可以做

>>> x = B()
>>> x.b
'boo'

可是我做不到

>>> y = A()
>>> y.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'a'

进一步的问题:

  • 关于 __init__ 有什么我不明白的?

我不认为这与 forward declaration 相同,因此我希望这个问题不是重复的。

附带说明一下,我的目标是实现 DSL,但这主要是让自己学习 Python 的借口。

最佳答案

首先,在 B 类中,函数 foo() 在声明之前被调用。 A 没有这个问题,因为 foo() 只在类被实例化时调用——在定义函数 foo 之后。

对于你的第二个问题,y.a 将不起作用,因为你没有说 self.a = foo('stirng')a = foo('stirng') 仅在 __ init __ 的范围内创建变量 a。

理想的 __ init __ 函数将变量分配给实例 self

关于类内函数的 Python 前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com