Понимание объектов в 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
>>>
В вашем коде отсутствуют две вещи:
методы, принадлежащие классу, должны иметь явное
self
параметр, который вам не хватаетВаш производный класс '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.