python - 如何拆分()字符串并将其传递给对象的 __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'”而且我不知道为什么。此外,这段代码中的所有评论都来自我的导师,作为作业的一部分,所以即使有更快/更好的方法来完成这一切,这也是我必须这样做的方式:/
解决方案
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
但请遵守约定。