繁体   English   中英

如何修复Python中的“类名未定义”错误?

[英]How to fix “Class name is not defined” error in Python?

晚上好,我的代码遇到了一些麻烦。 我的目标是将数据输入到类中。 所以我有p1 = Pitch(“ CH”,“ S”)。 从这里开始,我要运行一个函数,该函数打印带有输入该数据的语句的语句,并使用另一个函数在print语句中查找平均速度。 我的不好是,如果这在很大程度上没有意义,但是让我发布我到目前为止的代码,看看它是否可以提供更好的视觉效果。

import csv

fh = open('pitches.csv')
spreadsheet = csv.DictReader(fh)

startspeed = []

class Pitch:
    def __init__(self, name, result):
        fh = open('pitches.csv')
        self.spreadsheet = csv.DictReader(fh)
        self.name = name
        self.result = result

    def avg_start_speed(self):
        for row in spreadsheet:
            if row['pitch_type'] == str(self.name) and row['type'] == str(self.result):
                startspeed.append(row['start_speed'])
        return sum(startspeed) / len(startspeed)


    def myfunc(self):
        for row in spreadsheet:
            if row['pitch_type'] == self.name:
                print("The average speed of a " + self.result + " for a "
                    + self.name + " is " + str(self.avg_start_speed()))

p1 = Pitch("CH", "S")
p1.myfunc()

我收到此错误

NameError:名称“ avg_start_speed”未定义

我不确定如何解决。 感谢您提前提出所有建议。

CSV样本:

start_speed end_speed   type    pitch_type
92.9    84.1    S   FF
92.8    84.1    S   FF
94.1    85.2    S   FF
91  84  B   FF
75.4    69.6    B   CU
92.9    84.8    S   CH
93.3    85.3    B   FF
89.3    82.4    X   FC
92.1    85  S   CH

您的代码中的一些问题。

  • 您在def avg_start_speed():中缺少一个self变量def avg_start_speed():假设您想将其用作类方法。 (我也看到您也在函数定义中使用self )。 因此它将是def avg_start_speed(self):

  • 您还想在myfunc使用self调用avg_start_speed()函数self.avg_start_speed()

  • 您还可以在课程外定义spreadsheet 为什么不在类内部(可能在__init__定义它并使用它呢?

  • 您也不会在avg_start_speed()函数中声明startspeed变量

永远记住,对于类方法,第一个参数始终是self ,您可以使用class.func()在类中的其他类方法中调用它们

使这些更改生效,代码看起来像

import csv

class Pitch:
    def __init__(self, name, result, spreadsheet):
        self.spreadsheet = spreadsheet
        self.name = name
        self.result = result

    def avg_start_speed(self):
        #Calculate average speed and return
        startspeed = []
        for row in self.spreadsheet:
            if row['pitch_type'] == self.name and row['type'] == self.result:
                startspeed.append(float(row['start_speed']))
        return sum(startspeed) / len(startspeed)


    def myfunc(self):

        #Call avg_start_speed here and print it using string.format
        avg_start_speed = self.avg_start_speed()
        print("The average speed of a {} for a {} is {}".format(self.result,self.name ,
            avg_start_speed))

#Open pitches.csv outside the class
with open('pitches.csv') as fh:
    #Open the csv as a dict and pass it as an argument to Pitch
    spreadsheet = csv.DictReader(fh)
    p1 = Pitch("CH", "S", spreadsheet)
    p1.myfunc()

因此,如果pitches.csv看起来像

start_speed,end_speed,type,pitch_type
92.9,84.1,S,CH
94.1,85.2,S,CH

输出将是

The average speed of a S for a CH is 93.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM