0

如果问题如此愚蠢,请裸露,但我基本上来自 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'是一个全局变量吗?

4

2 回答 2

2

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

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

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

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

这个其他问题的答案提供了有关 Python 范围的更多详细信息:

范围规则的简短描述?

于 2013-08-19T19:21:42.710 回答
1

请参阅命名和绑定参考;函数中未分配给 ('bound') 的函数中的 Python 名称被视为自由变量

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

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

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

还给函数一个本地名称log,即传递logHandler对象;函数内部log绑定到同一个对象,因此您可以使用它log.logMsg()

于 2013-08-19T19:04:45.290 回答