我试图使用文件中的信息创建一个Soda对象的多个实例。文件的格式如下:名称、价格、编号
Mtn. Dew,1.00,10
Coke,1.50,8
Sprite,2.00,3
我的代码是(这是main()中的函数):
^{pr2}$如果我做对了,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”和拆分(“,”)方法的预期结果应该形成一个类似[”Mtn的列表。Dew”,“1.00”,“10”]其中我可以使用该列表的索引来只返回名称。在
但是,我得到了一个错误“AttributeError:Soda instance没有属性‘split’”,我不知道为什么。另外,这段代码中的所有注释都是作为作业的一部分来自我的导师,所以即使有更快/更好的方法来完成这一切,我也必须这样做:/
self
变量引用对象实例。您可以做的是在构造函数中拆分行,如下所示…或者你可以在被要求的时候懒散地分开
^{pr2}$注意,在python中,函数名等变量通常是
snake_case
。在当您使用
self
时,您引用了Soda
的实例,并且由于您没有定义split方法,因此它不会有split方法。在您可以简单地使用解包将
split
的结果传递给类。在您可能需要添加一些检查,以确保解包返回三个值,但是由于您使用默认参数,因此只有当您提供的多于三个值时才会出错。在
输出:
^{pr2}$您甚至可以定义一个helper方法,从文件中的一行返回一个
Soda
实例:您可以调用:
等一下。这是人们学习代码时常见的误解。基本上,您将源代码与数据类型
str
混为一谈。这是一个很容易犯的错误,因为实际上,一个人在编写源代码时创建了一个文本文件。我们可以将文本写入文件,甚至可以在Python(open('my_script.py').read())
)中加载文本,然后得到一个字符串!是的,当你的源代码从你的编程语言到机器代码的过程中,字符串会被你运行的程序消耗掉。但我主张你在头脑中把这两件事分开。源代码不是字符串。它应该在概念上“高于”它(不管怎样,我们在这里处理的是有用的抽象)。所以,虽然你的想法基本上是正确的但这里的“行”指的是行所指的,即代码执行的逻辑片段,而不是字面上所写的代码行。因此,
self
引用对象实例,当方法由类的实例执行时。在所以,
self
不是一个字符串。它是类定义的类型的对象。你的类没有这个方法。str
对象可以。在下面我们来看看python数据模型。”“自我”是相当直截了当的。实例本身作为参数传递。这是通过“魔术”(你以后可以学着玩的魔术)为你做的,但是本质上,
my_instance.some_method()
基本上是等价于MyClass.some_method(my_instance)
所以考虑一下
方法只是一个属于类的函数,如果它被类的实例调用,它会自动神奇地将实例本身作为第一个参数传递。请注意,这里有特权的是参数的位置,而不是仅仅是惯例的名称self。你想要什么都行。名称甚至不必在类中保持一致(但当然,在函数本身内部是一致的)。我们把它叫做西葫芦吧:
^{pr2}$但是,请遵守惯例。在
相关问题 更多 >
编程相关推荐