Понимание объектов в Python

Я немного смущен объектной моделью Python. У меня есть два класса, один наследует от другого.

class Node():
  def __init__(identifier):
    self.identifier = identifier

class Atom(Node):
  def __init__(symbol)
    self.symbol = symbol

Я пытаюсь не переопределять метод __init__(), а создать экземпляр атома, который будет иметь атрибуты symbol и identifier.

Как это:

Atom("Fe", 1) # will create an atom with symbol "Fe" and identifier "1"

Таким образом, я хочу иметь доступ к Atom.identifier и Atom.symbol после создания экземпляра Atom.

Как я могу это сделать?

6 ответов

Решение
>>> class Node(object):
...     def __init__(self, id_):
...             self.id_ = id_
... 
>>> class Atom(Node):
...     def __init__(self, symbol, id_):
...             super(Atom, self).__init__(id_)
...             self.symbol = symbol
... 
>>> a = Atom("FE", 1)
>>> a.symbol
'FE'
>>> a.id_
1
>>> type(a)
<class '__main__.Atom'>
>>> 

Хорошая идея наследовать от объекта в вашем коде.

Вы должны позвонить __init__метод суперкласса вручную.

class Atom(Node):
  def __init__(self, symbol, identifier)
    Node.__init__(self, identifier)
    self.symbol = symbol

При создании класса вам нужно использовать собственное слово в объявлении. После этого вы можете определить другие аргументы. Для наследования вызовите метод super init:

>>> class Node():
...   def __init__(self, identifier):
...     self.identifier = identifier
...
>>>
>>> class Atom(Node):
...   def __init__(self, symbol, identifier):
...     Node.__init__(self, identifier)
...     self.symbol = symbol
...
>>>
>>>
>>> fe = Atom("Fe", 1)
>>> fe.symbol
'Fe'
>>> fe.identifier
1
>>>

В вашем коде отсутствуют две вещи:

  1. методы, принадлежащие классу, должны иметь явное self параметр, который вам не хватает

  2. Ваш производный класс 'Atom' также должен принять параметр, который должен использовать для инициализации базового класса.

Нечто подобное:

class Node():
  def __init__(self, identifier):
    self.identifier = identifier

class Atom(Node):
  def __init__(self, identifier, symbol)
    Node.__init__(self, identifier)
    self.symbol = symbol
class Node(): 
  def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
  def __init__(self, symbol, *args, **kwargs)
    super(Atom, self).__init__(*args, **kwargs)
    self.symbol = symbol

Смотрите здесь для объяснения *args а также **kwargs, Используя super, вы можете получить доступ к базовому классу (суперклассу) класса Atom и вызвать его __init__, Так же self Параметр также должен быть включен.

class Node(object): 
  def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
  def __init__(self, symbol, *args, **kwargs)
    super(Atom, self).__init__(*args, **kwargs)
    self.symbol = symbol

Точки:

  • Узел должен наследовать от object,
  • использование super называть родительские классы __init__ функции.
  • Функции-члены класса принимают self в качестве первого параметра в Python.
Другие вопросы по тегам