【问题标题】:Failing hard at OOP in python在 python 中的 OOP 上失败了
【发布时间】:2016-02-01 18:38:16
【问题描述】:

这代表一个简单的类,我已经尝试和实践 OOP。

import csv
import logging


class LoaderCSV:

    def __init__(self, file):
        self.file = file

        if file is None:
            logging.warning('Missing input file.')

    def load(self):
        with open(self.file) as f:
            holder = csv.reader(f)
            file_data = list(holder)

        return file_data

当我调用这个类时会发生什么:

data = LoaderCSV.load(input_file)

我明白了

line 14, in load 
with open(self.file) as f:
AttributeError: 'str' object has no attribute 'file'

我一定是搞砸了,但不明白是什么。我之前的尝试以这种方式工作得很好。我就是不明白为什么

self.file

当在__init__下定义时,不传递分配给参数的值

【问题讨论】:

    标签: python oop object


    【解决方案1】:

    问题是您将实例方法作为静态方法调用,因此您的文件名被传入而不是self。这样做的正确方法是:

    loader = LoaderCSV(input_file)
    data = loader.load()
    

    这会将loader 作为self 参数传入,允许您访问对象的file 字段中的文件名。

    查看classes 上的 Python 文档了解更多信息。

    【讨论】:

    • 那是由 init 函数引起的吗?我的意思是如果有 init 我必须先将参数传递给类本身,然后调用该方法来启动它?这可以在没有init的情况下工作吗?谢谢大家的回答:)
    【解决方案2】:

    您需要先创建LoaderCSV 对象,然后对该对象调用load 方法。

    loader = LoaderCSV(input_file)
    data = loader.load()
    

    【讨论】:

      【解决方案3】:

      使用实例方法load 的方法是创建一个类的实例,然后调用该类的方法。像这样:

      myloader = LoaderCSV(input_file)
      data = myloader.load()
      

      简而言之:

      data = LoaderCSV(input_file).load()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-24
        • 2011-07-25
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        相关资源
        最近更新 更多