python访问方法中的全局变量。?

时间:2013-08-19 19:02:33

标签: python python-2.7

如果这个问题太愚蠢,那么我可以裸露,但我基本上来自c / c ++背景。

我有以下代码。

#!/usr/bin/python

import os


class Logger(object):

    def __init__ (self):
        print "Constructor of Logger "

    def logMsg(self):
        print "logMsg::"


class FileLogger (Logger):
    def __init__ (self):
        print "Constructor of File Logger"
    def logMsg (self):
        print "FileLogger::"

class FTPLogger (Logger):

    def __init__ (self):
        print "Constructor of FTP Logger"

    def logMsg (self):
        print "FTPLogger::"


def logMsg(log):
    print "Logging Message"
    logHandler.logMsg()    # **HERE: HOW POSSIBLE TO ACCESS logHandler Variable?**


logHandler = FileLogger ();
logMsg(logHandler);

问题:

FileLogger类的logMsg()函数如何能够访问logHandler?。

我可以认为'logHandler'是一个全局变量吗?

2 个答案:

答案 0 :(得分:2)

当你在任何函数之外定义logHandler变量时,该变量在模块中的范围内变成全局的(本质上是Python文件),你可以在像logMsg(log)这样的函数中看到它(并引用它)。 p>

但是,在您编写的代码的上下文中,在我看来,使用logHandler会出错,因为您将logHandler对象传递给logMsg函数。你的logMsg函数看起来应该是这样的,我想:

def logMsg(log):
    print "Logging Message"
    log.logMsg()

否则,当您将另一个对象传递给该函数时,它将尝试访问全局变量logHandler中的任何一个,而不是您在日志中传入的那个。

这个问题的答案提供了有关Python范围的更多细节:

Short Description of the Scoping Rules?

答案 1 :(得分:1)

参见Naming and Binding参考资料;未在该函数中分配给('bound')的函数中的Python名称被视为自由变量

  

如果变量在代码块中使用但未在其中定义,则它是自由变量

在父作用域中查找自由变量,最终在全局范围内查找。

logHandler函数永远不会分配logMsg()名称,因此Python认为它是一个自由变量,并在全局命名空间中查找它。您的模块中存在一个名称的实际全局,因此代码可以正常工作,并且不会引发NameError异常。

为函数提供了一个本地名称log,它传递了logHandler个对象;函数log内部绑定到同一对象,因此您可以使用log.logMsg()代替。