新しいクラス インスタンスを作成するときに、別のクラスのメソッドを呼び出そうとしていますが、動作させることができません。ここに私が持っているものがあります:
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)
入力としてafile.xlxsNameError: global name 'read_xlsx' is not defined
を使用してこれを実行すると、Python の知識に大きな穴を発見したと思いました (それほど多くないというわけではありませんが、見にくい傾向があります。大きな森...)。
私はgetattr(Analysis(), ... )
、Analysis クラスとそのメソッドを見つけるグローバルな名前空間にアクセスすると考えていたでしょう。実際print(globals().keys())
、Analysis がこの一部であることを示しています。
['plt', 'mlab', '__builtins__', '__file__', 'pylab', 'DataProject', 'matplotlib', '__package__', 'W32', 'Helpers', 'time', 'pd', 'pyplot', 'np', '__name__', 'dt', 'Analysis', '__doc__']
ここで何が欠けていますか?
編集:
完全なトレースバックは次のとおりです。
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
私の主な呼び出しは次のとおりです。
if __name__=="__main__":
a=DataProject(input_file='C:\\MPython\\dataAnalysis\\EnergyAnalysis\\afile.xlx',readnow=True)