模块在Python中没有OOP属性

问题描述 投票:0回答:1

我对 Python 中的 OOP 非常陌生。

我编写了一个 python 脚本,它接受一个输入文件并从中绘制一些数据。现在我想为几个不同的数据文件制作相同的图,所以我想我应该将我的脚本放入一个类中。

这个类存在于一个名为

TargetRunAnalyser.py
的文件中,到目前为止是这样的:

from ROOT import TFile, TCanvas
import os, sys

def tot_event_waveforms(root_file):
    sd = root_file.Get("Target/Waveforms")
    NEvents=0
    for keyname in sd.GetListOfKeys():
        NEvents+=1
    NEvents/=32
    return NEvents

class TargetRunAnalyser:

    x_channels = [8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,0]
    y_channels = [27,28,26,29,25,30,24,31,23,16,22,17,21,18,20,19]
    
    intersection = set(x_channels) & set(y_channels)
    
    if len(x_channels) != 16 or len(y_channels) != 16:
        print(f"x_channel array length: {len(x_channels)}, y_channel array length: {len(y_channels)}")
        raise Exception("Check channel arrays, they should both have 16 elements")
    
    if len(intersection) !=0:
        raise Exception(f"The following channels are in both x and y: {intersection}")
    
    def __init__(self,run_no):
        self.run_no = run_no
        self.file_path=os.path.join("/Users/bethlong/Downloads/", f"Run{self.run_no}_HistoFile.root")
        self.root_file = TFile(self.file_path,"read")
        self.n_event_print = 100

        #check how many events you have waveforms for so that you don't print more
        n_event_tot = tot_event_waveforms(self.root_file)

        if self.n_event_print>n_event_tot:
            self.n_event_print = n_event_tot

    def canvas_creator(self, canv_name):
        my_canvas = TCanvas("mycanv","mycanv",900,700)
        return my_canvas

我在一个单独的文件中调用这个类,如下所示:

import TargetRunAnalyser
import ROOT

def main():
    RunsToAnalyse = [50252,50305]
    Analysers = [TargetRunAnalyser.TargetRunAnalyser(run) for run in RunsToAnalyse]
    print([i_Analyser.n_event_print for i_Analyser in Analysers])

    canvas_x_signals = TargetRunAnalyser.canvas_creator("x_signals")
    
if __name__ == '__main__':
    main()

但是我收到错误:

    canvas_x_signals = TargetRunAnalyser.canvas_creator("x_signals")
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'TargetRunAnalyser' has no attribute 'canvas_creator'

谁能告诉我为什么

TargetRunAnalyser.TargetRunAnalyser(run)
可以,而
TargetRunAnalyser.canvas_creator("x_signals")
却不行?

python class oop
1个回答
1
投票

谁能告诉我为什么

TargetRunAnalyser.TargetRunAnalyser(run)
很好

这是有效的,因为第一个

TargetRunAnalyser
指的是 module,第二个
TargetRunAnalyser
指的是 in 模块中的 class

但是

TargetRunAnalyser.canvas_creator("x_signals")
不是吗?

这不起作用,因为

TargetRunAnalyser
仅指 module,而不是 class

将模块命名为其他名称可能会有所帮助,这样模块和类就不会具有相同的名称。

© www.soinside.com 2019 - 2024. All rights reserved.