Python 3:datetime.strptime()返回一个整数列表而不是字符串

时间:2017-07-03 15:58:13

标签: python csv datetime inheritance strptime

我正在关注Python Crash Course中的一个项目,该项目演示了如何使用CSV文件。下面的代码使用我认为的dates对象成功填充datetime列表。例如,这是dates列表的第一个元素:datetime.datetime(2014, 1, 1, 0, 0)。这是功能代码:

import csv
from datetime import datetime

filename = 'sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)

    # Move onto the next row as the first contains no data
    next(reader)

    dates = []
    for row in reader:
        try:
            date = datetime.strptime(row[0], "%Y-%m-%d")
        except ValueError:
            print(date, "missing data")
        else:
            dates.append(date)

    print(dates[0])

此代码的输出为:2014-01-01 00:00:00

现在,我想用几个不同的文件实现这个项目,并用OO设计原则练习。我设置了一个父类WeatherData,它有两个属性:一个名为data的列表和一个名为filename的字符串。 WeatherData类将使用CSV文件中的特定列填充data列表。接下来,我创建了一个名为WeatherLocation的子类,它继承自WeatherDataWeatherLocation有三个属性:

  • 一个名为highs的列表,用于存储最高温度
  • 存储低温的名为lows的列表
  • 一个名为dates的列表,用于存储日期

如果我们查看set_data的{​​{1}}方法,我们会看到与上面的代码实现相同的逻辑。调用WeatherData的{​​{1}}方法时,将传递相同的行号,并将set_dates设置为WeatherLocation,以便执行if语句的正确部分。代码如下所示:

fetching_dates

不幸的是,此代码的输出为True。我做错了什么?

2 个答案:

答案 0 :(得分:2)

问题是您的超类WeatherData有一个data属性WeatherLocation继承。每次set_data您修改相同的data属性时。在WeatherLocation子类(例如self.highs = self.set_highs())中分配值时,您只返回对data属性的引用。

当你print(sitka.dates[0])获取实例sitka的{​​{1}}的第一个元素时,它实际上只是对dates的引用。 sitka.dates首先调用__init__(并且是修改self.set_highs()的第一件事),因此您确实打印了第一个高点。如果您data,您应该看到相同的值(例如46)。

如果您打印完整的数据列表(print(sitka.data[0])),您应该会看到该订单中的高点,低点和日期列表。

答案 1 :(得分:0)

由于WeatherData.set_data()每次运行都会附加到列表self.data,因此第一个元素sitka.dates[0]将是set_highs()的结果,因此它是一个整数。由于您最后致电set_dates,因此日期将会更晚。

self.highs = self.set_highs()  // append integers to self.data
self.lows = self.set_lows()  // append integers to self.data
self.dates = self.set_dates()  // append datetimes to self.date

您的类的设计,尤其是继承的使用非常混乱。您可能需要考虑重构和使用python属性,而不是使用getter和setter方法。

Python @property versus getters and setters