gpt4 book ai didi

python - 为什么在 __init__ 期间实例化的对象看不到它们的创建者?

转载 作者:行者123 更新时间:2023-11-28 19:58:30 24 4
gpt4 key购买 nike

好吧,我也是 SO、OOP 和 python 的新手,所以请保持温和 ;)

我已经在其他地方寻找与此范围界定问题相关的线程和解释,但没有找到。如有任何帮助,我将不胜感激。

示例代码:

class Zeus(object):
def __init__(self):
self.name='zeus'
self.maze=Maze()
self.maze.get_zeus_name_1()
self.maze.get_zeus_name_2(self)
self.get_name_1()
self.get_name_2(self)

def get_name_1(self):
try:
print zeus.name
except:
print "impossible!?"

def get_name_2(self,scope):
print scope.name

class Maze(object):
def get_zeus_name_1(self):
try:
print zeus.name
except:
print "can't be done!?"

def get_zeus_name_2(self,scope):
print scope.name

zeus=Zeus()
print 'now external calls:'
zeus.maze.get_zeus_name_1()
zeus.maze.get_zeus_name_2(zeus)
zeus.get_name_1()
zeus.get_name_2(zeus)

输出:

can't be done!?
zeus
impossible!?
zeus
now external calls:
zeus
zeus
zeus
zeus

zeus 实例化过程中,如果 __init__ 方法创建了另一个类 maze 的实例,则这个新实例无法访问它的创建者对象 zeus(除非 self 被传递给它)。(此外,如果 __init__ 方法在它自己的类 get_name_1 中调用一个方法,该方法也不能访问它的对象属性(除非 self 是传递给它)。)

但是,在两个对象都被实例化之后,第二个对象 maze 现在可以识别并访问其创建者对象 zeus

这种行为给我带来了一些困惑和困难,因为我正在处理一些代码,其中所有内容都已初始化并从 __init__ 序列运行 - 现在我认为最好避免这种情况..

我的问题:

  1. 为什么会这样?
  2. 是否可以通过在 __init__ 调用中保留实例化来最好地避免由此产生的问题?
  3. 是否有进一步的设计影响?
  4. self 传递给新实例,似乎会产生问题,由于自引用,是否也应该避免这种情况?
  5. 其他有趣的含义/我是否遗漏了什么?

感谢您的帮助。

最佳答案

get_zeus_name_1() 正在尝试访问全局变量 zeus,该变量在 get_zeus_name_1() 时尚未初始化打电话。

get_zeus_name_2() 接受一个参数 (scope) 并访问它,这是有效的。它不会尝试访问全局变量 zeus

get_name_1()get_name_2() 相同。

我认为关键在于理解python如何执行这一行:

zeus=Zeus()

这一行对 python 说:执行方法 Zeus()(这是 Zeus__init__(self) 方法的另一个名称) > class),然后将该方法返回的对象赋值给全局变量 zeus

Python 首先执行 Zeus() 方法, init 方法执行完毕并返回 Zeus 类的对象实例后,python 为该对象赋值到全局变量 zeus。所以全局变量 zeus 直到 init 方法完成后才被定义,所以 get_name_1() 和 get_zeus_name_1() 无法访问它。

get_name_2() 和 get_zeus_name_2() 访问与 get_name_1() 和 get_zeus_name_1() 尝试访问的 Zeus 类相同的对象实例,但它们通过传递给它们的参数访问它,而不是通过全局变量,所以他们不会遇到问题。

这是一个更简单的示例,它演示了完全相同的问题:

>>> class Foo:
... def __init__(self):
... self.name = 'foobar'
... print self.name
... print foo.name
...
>>> foo = Foo()
foobar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __init__
NameError: global name 'foo' is not defined
>>>

print self.name 行工作正常(相当于 get_name_2() 和 get_zeus_name_2()),但是 print foo.name 行崩溃(相当于 get_name_2 () 和 get_zeus_name_2())。

关于python - 为什么在 __init__ 期间实例化的对象看不到它们的创建者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9045433/

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