首页 > 解决方案 > 如何拆分()字符串并将其传递给对象的 __init__() 方法?

问题描述

我正在尝试使用文件中的信息创建 Soda 对象的多个实例。该文件的格式如下名称,价格,编号

Mtn. Dew,1.00,10

Coke,1.50,8

Sprite,2.00,3

我的代码是这样的(这是 main() 中的一个函数):

from Sodas import Soda

def fillMachine(filename) :

    # Create an empty list that will store pop machine data
    popMachine = []

    # Open the file specified by filename for reading
    infile = open(filename, "r")

    # Loop to read each line from the file and append a new Soda object 
    # based upon information from the line into the pop machine list.
    for line in infile :
        popMachine.append(Soda(str(line.strip())))

    # Close the file
    infile.close()

    # Return the pop machine list
    return popMachine

如果我做对了,popMachine 应该是 3 个不同的 Soda 对象的列表,每个对象都有一行输入文件。

然后,在我的课堂上,我需要能够获得名称、价格或数量,以便以后用于计算。我的苏打水课代码如下所示:

#Constructor
def __init__(self, _name = "", _price = 0.0, _quantity = 0) :
        self._name = self.getName()
        self._price = _price
        self._quantity = _quantity

def getName(self) :
    tempList = self.split(",")
    self._name = tempList[0]
    return self._name

这是我遇到问题的地方。IIRC self 代替主代码中的行,因此 self 应该是一个字符串,例如“Mtn.Dew,1.00,10”,并且 split(",") 方法的预期结果应该形成一个类似 ["Mtn . dew", "1.00", "10"] 然后我可以使用该列表的索引来返回名称。

但是,我收到此错误“AttributeError: Soda instance has no attribute 'split'”而且我不知道为什么。此外,这段代码中的所有评论都来自我的导师,作为作业的一部分,所以即使有更快/更好的方法来完成这一切,这也是我必须这样做的方式:/

标签: pythonclasssplitfactorystatic-methods

解决方案


IIRC self 代替主代码中的行,因此 self 应该是一个字符串,例如“Mtn.Dew,1.00,10”,并且 split(",") 方法的预期结果应该形成一个类似 ["Mtn . dew", "1.00", "10"] 然后我可以使用该列表的索引来返回名称。

等一下。当人们学习编码时,这是一个常见的误解。从根本上说,您将源代码与 data-type 混为一谈str。这是一个容易犯的错误,因为确实,在编写源代码时会创建一个文本文件。一个人将文本写入文件,甚至可以在 Python 中加载它(open('my_script.py').read())我们得到一个字符串!是的,当您的源代码从您的编程语言转变为机器代码时,您运行的程序会使用字符串。但是我提倡你将这两件事分开。你的源代码不是一个字符串。它应该在概念上位于它的“上方”(无论如何,我们在这里处理有用的抽象)。所以,虽然你的想法基本上是正确的,

self 代替主代码中的行

但是这里的“行”是指行所指的内容,即由您的代码执行的逻辑,而不是您编写的代码行。所以,当方法被类的实例执行时,self指的是对象实例。

所以,self不是字符串。它是您的类定义的类型的对象。你的班级没有那个方法。str对象做。

这里稍微看一下python数据模型。“自我”非常简单。实例本身作为参数传递。这是通过“魔法”(您可以稍后学习使用的魔法)在幕后为您完成的,但基本上,my_instance.some_method()基本上相当于MyClass.some_method(my_instance)

所以考虑,

In [1]: class SomeClass:
   ...:     def __init__(self, name):
   ...:         self.name = name
   ...:     def foo(self):
   ...:         print(self.name, 'says foo!')
   ...:

In [2]: some_instance = SomeClass('Juan')

In [3]: some_instance.foo()
Juan says foo!

In [4]: SomeClass.foo(some_instance)
Juan says foo!

方法只是一个作为类的一部分的函数,如果它被该类的实例调用,它将自动神奇地将实例本身作为第一个参数传递。请注意,这里优先考虑的是参数的位置,而不是仅仅是约定的名称self 。它可以是你想要的任何东西。名称甚至不必在类内保持一致(当然,在函数本身内保持一致)。让我们称它为西葫芦吧:

In [8]: class WhyNot:
   ...:
   ...:     def __init__(self):
   ...:         self.foo_flag = False
   ...:         self.bar_flag = False
   ...:
   ...:     def foo(zucchini):
   ...:         print("I speak American English")
   ...:         zucchini.foo_flag = True
   ...:
   ...:     def bar(courgette):
   ...:         print("And British English")
   ...:         courgette.bar_flag = True
   ...:
In [9]: x = WhyNot()

In [10]: x.foo()
I speak American English

In [11]: x.bar()
And British English

In [12]: x.foo_flag
Out[12]: True

In [13]: x.bar_flag
Out[13]: True

但请遵守约定。


推荐阅读