首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用getattr访问方法

使用getattr访问方法
EN

Stack Overflow用户
提问于 2013-09-08 00:33:34
回答 1查看 1.4K关注 0票数 0

当创建一个新的类实例时,我试图在一个不同的类中调用一个方法,但是它无法工作。我现在拥有的是:

代码语言:javascript
复制
class DataProject(object):    
    def __init__(self, name=none,input_file=None,datamode=None,comments=None,readnow=True):
        ..............
        # here's where I'm trying to call the method in the other class
        if type(input_file) == str:
            self.input_file_format = self.input_file.split(".")[-1]
            if readnow:
                getattr(Analysis(),'read_'+self.input_file_format)(self,input_file)

class Analysis(object):
    def __init__(self):
        pass # nothing happens here atm

    def read_xlsx(self,parent,input_file):
        """Method to parse xlsx files and dump them into a DataFrame"""
        xl = pd.ExcelFile(input_file)
        for s in sheet_names:
            parent.data[s]=xl.parse(s)

当我以NameError: global name 'read_xlsx' is not defined作为输入运行它时,我得到了一个afile.xlxs,这让我认为我刚刚发现了我的Python知识中的一个巨大的漏洞(并不是说没有那么多,但它们往往很难看到,有点像大森林……)。

我认为getattr(Analysis(), ... )将访问全局名称空间,在其中它将查找Analysis及其方法。事实上,print(globals().keys())表明分析是其中的一部分:

['plt', 'mlab', '__builtins__', '__file__', 'pylab', 'DataProject', 'matplotlib', '__package__', 'W32', 'Helpers', 'time', 'pd', 'pyplot', 'np', '__name__', 'dt', 'Analysis', '__doc__']

我在这里错过了什么?

编辑:

完整的回溯是:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\MPython\dataAnalysis\dataAnalysis.py", line 101, in <module>
    a=DataProject(input_file='C:\\MPython\\dataAnalysis\\EnergyAnalysis\\afile.xlxs',readnow=True)
  File "C:\MPython\dataAnalysis\dataAnalysis.py", line 73, in __init__
    getattr(Analysis(),'read_'+self.input_file_format)(self,input_file)
  File "C:\MPython\dataAnalysis\dataAnalysis.py", line 90, in read_xls
    read_xlsx(input_file)
NameError: global name 'read_xlsx' is not defined

我的主要电话是:

代码语言:javascript
复制
if __name__=="__main__":
    a=DataProject(input_file='C:\\MPython\\dataAnalysis\\EnergyAnalysis\\afile.xlx',readnow=True)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-08 00:46:35

从完整的回溯来看,您的DataProject类似乎正在调用(成功) Analysys.read_xls方法,而后者又试图调用read_xlsx。但是,它将其称为全局函数,而不是方法。

您可能只需要替换第90行的代码,将read_xlsx(input_file)转换为self.read_xlsx(input_file),尽管您可能还需要为父DataProject实例传递一个额外的参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18679233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档