如何分割一个字符串并将其传递到对象的\uuInit_Uu()方法中?

2024-05-14 15:52:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用文件中的信息创建一个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’”,我不知道为什么。另外,这段代码中的所有注释都是作为作业的一部分来自我的导师,所以即使有更快/更好的方法来完成这一切,我也必须这样做:/


Tags: 文件对象代码nameself名称列表def
3条回答

self变量引用对象实例。您可以做的是在构造函数中拆分行,如下所示

def __init__(self, line):
    name, price, quantity = line.split(',')
    self.name = name
    self.price = price
    self.quantity = quantity

…或者你可以在被要求的时候懒散地分开

^{pr2}$

注意,在python中,函数名等变量通常是snake_case。在

当您使用self时,您引用了Soda的实例,并且由于您没有定义split方法,因此它不会有split方法。在

您可以简单地使用解包将split的结果传递给类。在

您可能需要添加一些检查,以确保解包返回三个值,但是由于您使用默认参数,因此只有当您提供的多于三个值时才会出错。在

class Soda:
  def __init__(self, name = "", price = 0.0, quantity = 0) :
        self.name = name
        self.price = price
        self.quantity = quantity


sodas = []
with open('test.txt') as f:
  for line in f:
    sodas.append(Soda(*line.split(',')))

for soda in sodas:
  print(soda.name)

输出:

^{pr2}$

您甚至可以定义一个helper方法,从文件中的一行返回一个Soda实例:

@staticmethod
def make_soda(line):
  try:
    name, price, quantity = line.split(',')
    return Soda(name, price, quantity)
  except:
    raise ValueError('Bad Soda')

您可以调用:

Soda.make_soda(line)

IIRC self stands in place of line in the main code, so self should be a string such as "Mtn. Dew,1.00,10" and the expected outcome of the split(",") method should form a list like ["Mtn. Dew", "1.00", "10"] where I can then use the index of that list to return just the name.

等一下。这是人们学习代码时常见的误解。基本上,您将源代码与数据类型str混为一谈。这是一个很容易犯的错误,因为实际上,一个人在编写源代码时创建了一个文本文件。我们可以将文本写入文件,甚至可以在Python(open('my_script.py').read()))中加载文本,然后得到一个字符串!是的,当你的源代码从你的编程语言到机器代码的过程中,字符串会被你运行的程序消耗掉。但我主张你在头脑中把这两件事分开。源代码不是字符串。它应该在概念上“高于”它(不管怎样,我们在这里处理的是有用的抽象)。所以,虽然你的想法基本上是正确的

self stands in place of line in the main code

但这里的“行”指的是行所指的,即代码执行的逻辑片段,而不是字面上所写的代码行。因此,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。你想要什么都行。名称甚至不必在类中保持一致(但当然,在函数本身内部是一致的)。我们把它叫做西葫芦吧:

^{pr2}$

但是,请遵守惯例。在

相关问题 更多 >

    热门问题