Понимание объектов в Python - PullRequest
7 голосов
/ 05 ноября 2010

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

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

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

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

Как это:

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

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

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

Ответы [ 6 ]

7 голосов
/ 05 ноября 2010
>>> 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'>
>>> 

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

6 голосов
/ 05 ноября 2010

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

class Atom(Node):
  def __init__(self, symbol, identifier)
    Node.__init__(self, identifier)
    self.symbol = symbol
3 голосов
/ 05 ноября 2010

При создании класса вам нужно использовать собственное слово в объявлении. После этого вы можете определить другие аргументы. Для наследования вызовите метод 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
>>>
2 голосов
/ 05 ноября 2010

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

  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
1 голос
/ 05 ноября 2010
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.
1 голос
/ 05 ноября 2010
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.

...