Python TypeError: должно быть str, а не Atom - PullRequest
1 голос
/ 02 августа 2020

Может ли кто-нибудь сказать мне понятным для новичков способом, почему я не могу напечатать название молекулы (здесь, в данном случае, «NaCl»)? если я заменю return Molecule([self, other]) на return Molecule([self.label, other.label]), мой код будет работать и выдает ожидаемый результат, но я хочу передавать экземпляры, а не атрибуты. вот мой код:

class Atom:
  def __init__(self, label):
    self.label = label

  def __add__(self, other):
    return Molecule([self, other])
    
class Molecule:
  def __init__(self, atoms):
    if type(atoms) is list:
        self.atoms = atoms
      
  def __repr__(self):
    lol = ''
    for i in self.atoms:
      lol += i
    return lol

sodium = Atom("Na")
chlorine = Atom("Cl")
salt = Molecule([sodium, chlorine])
salt = sodium + chlorine
print(salt)

вот изображение упражнения: моя проблема

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Ваш след говорит вам, на какую строку вам нужно смотреть. Строка 14:

lol += i

Python борется с этой причиной, сначала lol - это строка. Мы знаем это, потому что вы присвоили ему это с помощью lol = ''

, но теперь вы просите Python добавить экземпляр Atom к str. Однако вы не сказали Python, как он должен добавлять тип Atom к строчке.

Итак, у вас есть два варианта.

  1. In ваш класс Atom, переопределите функцию __repr__, а затем преобразуйте i в строку.

  2. В вашем классе Molecule добавьте к lol с помощью i.label а не просто i

0 голосов
/ 02 августа 2020

Реализуйте функцию __repr__ также в своем классе Atom и вызовите ее, используя str(atom);

class Atom:
    def __init__(self, label):
        self.label = label

    def __add__(self, other):
        return Molecule([self, other])

    def __repr__(self):
        return self.label

class Molecule:
    def __init__(self, atoms):
        if type(atoms) is list:
            self.atoms = atoms

    def __repr__(self):
        lol = ''
        for i in self.atoms:
            lol += str(i)
        return lol

sodium = Atom("Na")
chlorine = Atom("Cl")
salt = Molecule([sodium, chlorine])
salt = sodium + chlorine
print(salt)
...