代码之家  ›  专栏  ›  技术社区  ›  Daniel

如何使继承从父类到子类python34起作用

  •  2
  • Daniel  · 技术社区  · 10 年前

    我想了解继承的概念。我正努力在家长(班级)中完成工作 gps )和一个孩子(班级 print_gps ). 我正在使用 xlsxwriter 将gps数据保存到excel文件中。

    由于某些原因,我无法从类中获取数据 全球定位系统 在课堂上使用 打印gps .我错过了一步吗?

    import os
    import csv
    from csv import *
    import numpy
    import matplotlib
    from numpy import *
    from matplotlib import *
    import matplotlib.pyplot as plt
    from matplotlib.pylab import *
    import numpy as np
    #import nmea_defs
    #from nmea_defs import *
    
    
    #to export to excel
    import xlsxwriter
    from xlsxwriter.workbook import Workbook
    
    #to get the csv converter functions
    import os
    import subprocess
    import glob
    
    #to get the datetime functions
    import datetime
    from datetime import datetime
    from pytz import timezone
    import time
    import calendar
    
    
    #creates the path needed for incoming and outgoing files
    path_in = 'C:/Python34/gps_txts/'
    path_out = 'C:/Python34/output_files/'
    
    #prints all the data in the file if you want
    q_show_content = input('Print list of files type y:')
    if q_show_content == 'y':
        for root, dirs, files in os.walk(path_in):
              print(root, dirs, files)
    else:
        print('ok')
    
    
    data = []  #empty because we will store data into it
    
    
    
    #Reads a CSV file and return it as a list of rows
    def read_csv_file(filename):
        """Reads a CSV file and return it as a list of rows."""
    
        for row in csv.reader(open(filename)):
            data.append(row)
        return data
    
    #request of what file to look at
    print ("- - - - - - - - - - - - -")
    data_file = input('Which file do you want to look at?')
    
    f = open(path_in + data_file)
    read_it = read_csv_file(path_in + data_file)
    
    with f as csvfile:
        readCSV = csv.reader(csvfile,delimiter=',')
        plots = csv.reader(csvfile, delimiter=',')
    
    
    #creates the workbook
    output_filename = input('output filename:')
    workbook = xlsxwriter.Workbook(path_out + output_filename + '.xlsx')
    worksheet = workbook.add_worksheet()
    
    #formatting definitions
    bold    = workbook.add_format({'bold': True})
    date_format = workbook.add_format({'num_format': "m/d/yyyy hh:mm:ss"})
    
    #print number of rows
    print ("- - - - - - - - - - - - -")
    rows = len(read_it)
    print (data_file, " has "+ str(rows) + " rows of data")
    print ("- - - - - - - - - - - - -")
    
    #Counts the number of times a GPS command is observed
    def list_gps_commands(data):
        """Counts the number of times a GPS command is observed.
    
    Returns a dictionary object."""
    
        gps_cmds = dict()
        for row in data:
            try:
                gps_cmds[row[0]] += 1 
            except KeyError:
                gps_cmds[row[0]] = 1
    
        return gps_cmds
    
    print(list_gps_commands(read_it))
    print ("- - - - - - - - - - - - -")
    
    
     #Function process_gps_data for GPS 
    
    class gps:
        print ("- - - - - - - - - - - - -")
        print('We got class')
        print ("- - - - - - - - - - - - -")
    
    
    
        def process_gprmc_data(data):
            """Processes GPS data, NMEA 0183 format.
        Returns a tuple of arrays: latitude, longitude, velocity [km/h],
        time [sec] and number of satellites.
        See also: http://www.gpsinformation.org/dale/nmea.htm.
        """
            NMI = 1852.0
            latitude  = []
            longitude = []
            altitude  = []
            velocity  = []
            timestamp = []
            num_sats  = []
    
            print ("- - - - - - - - - - - - -")
            print('process_gprmc_data')
            print ("- - - - - - - - - - - - -")
            for row in data:
    
                if row[0] == '$GPRMC':     # Valid position/time sentence
                    y = (float(row[3][0:2]) + float(row[3][2:])/60.0)
                    if row[4] == "S":
                        y = -y
                    latitude.append(y)
                    x = (float(row[5][0:3]) + float(row[5][3:])/60.0)
                    if row[6] == "W":
                        x = -x
                    longitude.append(x)
                    print('x,y:',x,y)
                    velocity.append(float(row[7])*NMI/1000.0)
                    gpstime = row[1][0:6]                     # hhmmss
                    gdate = row[9]                            # ddmmyy
                    gpsdate = gdate[4:6]+gdate[2:4]+gdate[0:2]  # yymmdd
                    real_time =gpsdate + gpstime
                    add_date_time = datetime.strptime(real_time, "%y%m%d%H%M%S")
                    print(add_date_time)
                    timestamp.append(add_date_time)
            print ("- - - - - - - - - - - - -")
            print('arrays in')
            print ("- - - - - - - - - - - - -")
            return (array(latitude), array(longitude), array(velocity), array(timestamp))
    
        #had to create another function to print results
    class print_gps(gps):
        def __init__(self):
            self.gps = gps()        
            super(print_gps, self).__init__() 
    
        def process_gprmc_data(self):     
            self.gps.process_gprmc_data()
            # how to call process_gprmc_data()
            (lati, long, v, t_stamp) = self.gps.process_gprmc_data(data)
    #    def print_gprmc(process_gprmc_data):
            print('got definitions in')
            print ("- - - - - - - - - - - - -")
            print('lati:',lati)
            print ("- - - - - - - - - - - - -")
            print('long:',long)
            print ("- - - - - - - - - - - - -")
            print('v:',v)
            print ("- - - - - - - - - - - - -")
            print('date:', t_stamp)
            print ("- - - - - - - - - - - - -")
            if rows > 200:
                print('Big file please wait...thinking')
    
            #sets up the header row
            worksheet.write('A1','TimeStamp',bold)
            worksheet.write('B1', 'Latitude',bold)
            worksheet.write('C1', 'Longitude',bold)
            worksheet.write('D1', 'Velocity',bold)
            worksheet.autofilter('A1:D1')   #dropdown menu created for filtering
    
            # Create a For loop to iterate through each row in the XLS file, starting at row 2 to skip the headers
            for r, row in enumerate(data, start=1):  #where you want to start printing results inside workbook
                for c, col in enumerate(data):
                    worksheet.write_column(r,0, t_stamp, date_format)
                    worksheet.write_column(r,1, lati)
                    worksheet.write_column(r,2, long)
                    worksheet.write_column(r,3, v)
    
    
            workbook.close()
            f.close()
            print('XLSX file named ' + output_filename + ' was created')
    
    
    #processing piece
    
    command = input("What type do you want to look at?")
    if command == '$GPRMC':
    #    nmea_defs.gps(data)
        gps.process_gprmc_data(data)
        print_gps.process_gprmc_data(data)
    
    
    else:
        print("Invalid type:", command)
    

    我得到的结果和错误是:

    process_gprmc_data
    - - - - - - - - - - - - -
    x,y: 139.64428333333333 35.892158333333334
    2001-07-18 00:24:54
    x,y: 139.64430166666668 35.892201666666665
    2002-07-18 00:24:56
    x,y: 4.8333433333333335 45.00351833333333
    2003-08-14 10:47:09
    x,y: 5.00001 51.00351833333333
    2004-08-14 10:47:15
    - - - - - - - - - - - - -
    arrays in
    - - - - - - - - - - - - -
    Traceback (most recent call last):
      File "C:\Python34\choose_nmea.py", line 222, in <module>
        print_gps.process_gprmc_data(data)
      File "C:\Python34\choose_nmea.py", line 171, in process_gprmc_data
        self.gps.process_gprmc_data()
    AttributeError: 'list' object has no attribute 'gps'
    
    1 回复  |  直到 10 年前
        1
  •  3
  •   Mike Müller    10 年前

    您的程序存在多个问题。

    1.缺失 self

    在里面 class gps print_gps 更改:

    def process_gprmc_data(data):
    

    到:

    def process_gprmc_data(self, data):
    

    2.使用 CamleCase 用于类名

    重命名 gps 进入 GPS 打印gps 进入 PrintGPS

    3.无需 __init__() 呼叫

    因为 全球定位系统 没有 __初始化_() ,不需要打电话 super()__init__() 在里面 PintGPS .

    4.使用实例,而不是类

    更改:

    gps.process_gprmc_data(data)
    print_gps.process_gprmc_data(data)
    

    到:

    gps = GPS()
    gps.process_gprmc_data(data)
    print_gps = PrintGPS()
    print_gps.process_gprmc_data(data)
    

    5.不要将父类的实例作为属性放在子类中

    当您处理继承时,这没有多大意义:

    self.gps = gps() 
    

    您将通过继承从父级获取方法,并通过 super() (请参见下面的示例代码。)

    工作示例

    笔记 :由于缺少信息,我跳过了一些模式的实现。

    完整工作代码:

    from numpy import array
    
    class GPS:
    
        def process_gprmc_data(self, data):
            """Processes GPS data, NMEA 0183 format.
        Returns a tuple of arrays: latitude, longitude, velocity [km/h],
        time [sec] and number of satellites.
        See also: http://www.gpsinformation.org/dale/nmea.htm.
        """
            NMI = 1852.0
            latitude  = []
            longitude = []
            altitude  = []
            velocity  = []
            timestamp = []
            num_sats  = []
    
            print ("- - - - - - - - - - - - -")
            print('process_gprmc_data')
            print ("- - - - - - - - - - - - -")
            for row in data:
    
                if row[0] == '$GPRMC':     # Valid position/time sentence
                    y = (float(row[3][0:2]) + float(row[3][2:])/60.0)
                    if row[4] == "S":
                        y = -y
                    latitude.append(y)
                    x = (float(row[5][0:3]) + float(row[5][3:])/60.0)
                    if row[6] == "W":
                        x = -x
                    longitude.append(x)
                    print('x,y:',x,y)
                    velocity.append(float(row[7])*NMI/1000.0)
                    gpstime = row[1][0:6]                     # hhmmss
                    gdate = row[9]                            # ddmmyy
                    gpsdate = gdate[4:6]+gdate[2:4]+gdate[0:2]  # yymmdd
                    real_time =gpsdate + gpstime
                    add_date_time = datetime.strptime(real_time, "%y%m%d%H%M%S")
                    print(add_date_time)
                    timestamp.append(add_date_time)
            print ("- - - - - - - - - - - - -")
            print('arrays in')
            print ("- - - - - - - - - - - - -")
            return (array(latitude), array(longitude), array(velocity), array(timestamp))
    
        #had to create another function to print results
    class PrintGPS(GPS):
    
        def process_gprmc_data(self, data):
            # how to call process_gprmc_data()
            (lati, long, v, t_stamp) = super(PrintGPS, self).process_gprmc_data(data)
    
            print('got definitions in')
            print ("- - - - - - - - - - - - -")
            print('lati:',lati)
            print ("- - - - - - - - - - - - -")
            print('long:',long)
            print ("- - - - - - - - - - - - -")
            print('v:',v)
            print ("- - - - - - - - - - - - -")
            print('date:', t_stamp)
            print ("- - - - - - - - - - - - -")
    
    
            output_filename = 'test.xlsx'
    
            print('XLSX file named ' + output_filename + ' was created')
    
    data = 'abc'
    gps = GPS()
    gps.process_gprmc_data(data)
    print_gps = PrintGPS()
    print_gps.process_gprmc_data(data)