Создание экземпляра объекта в Python

У меня есть следующий код python для класса PortDataState, приведенный ниже.

class PortDataState(dict): # dict: Port class -> PortData class # slimed down version of OrderedDict as python 2.6 doesn't support it. _PREV = 0 _NEXT = 1 _KEY = 2 def __init__(self): super(PortDataState, self).__init__() self._root = root = [] # sentinel node root[:] = [root, root, None] # [_PREV, _NEXT, _KEY] # ****** linked list self._map = {} def _remove_key(self, key): link_prev, link_next, key = self._map.pop(key) link_prev[self._NEXT] = link_next link_next[self._PREV] = link_prev def _append_key(self, key): root = self._root last = root[self._PREV] last[self._NEXT] = root[self._PREV] = self._map[key] = [last, root, key] def _prepend_key(self, key): root = self._root first = root[self._NEXT] first[self._PREV] = root[self._NEXT] = self._map[key] = [root, first, key] def _move_last_key(self, key): self._remove_key(key) self._append_key(key) def _move_front_key(self, key): self._remove_key(key) self._prepend_key(key) def add_port(self, port, lldp_data): if port not in self: self._prepend_key(port) self[port] = PortData(port.is_down(), lldp_data) else: self[port].is_down = port.is_down() def lldp_sent(self, port): port_data = self[port] port_data.lldp_sent() self._move_last_key(port) return port_data def lldp_received(self, port): self[port].lldp_received() def move_front(self, port): port_data = self.get(port, None) if port_data is not None: port_data.clear_timestamp() self._move_front_key(port) def set_down(self, port): is_down = port.is_down() port_data = self[port] port_data.set_down(is_down) port_data.clear_timestamp() if not is_down: self._move_front_key(port) return is_down def get_port(self, port): return self[port] def del_port(self, port): del self[port] self._remove_key(port) def __iter__(self): root = self._root curr = root[self._NEXT] while curr is not root: yield curr[self._KEY] curr = curr[self._NEXT] def clear(self): for node in self._map.itervalues(): del node[:] root = self._root root[:] = [root, root, None] self._map.clear() dict.clear(self) def items(self): 'od.items() -> list of (key, value) pairs in od' return [(key, self[key]) for key in self] def iteritems(self): 'od.iteritems -> an iterator over the (key, value) pairs in od' for k in self: yield (k, self[k])

В другом классе я создаю объект PortDataState, как показано ниже

self.ports = PortDataState() # Port class -> PortData class

Я очень новичок в Python. Я хочу знать, что содержит self.ports? Я действительно не понимаю, что __init__ функция PortDataState делает выше. В частности, что делает

def __init__(self): super(PortDataState, self).__init__() self._root = root = [] # sentinel node root[:] = [root, root, None] # [_PREV, _NEXT, _KEY] # ****** linked list self._map = {}

имею в виду?

3 ответа

Функция __init__ в Python является методом конструктора как любой другой язык. Этот метод инициализирует поля классов (но метод __init__ не должен создавать сам объект, __init__ только модифицированный объект после его создания). Создание объекта выполняется автоматически при записи PortDataState() (т.е. При создании экземпляра объекта).

Что касается вашего объекта case, то self.ports будет содержать все методы и переменные, содержащиеся в классе dict (поскольку PortDataStates наследует от dict). Кроме того, ваш объект будет содержать:

  1. _PREV, _NEXT, _KEY (это статические переменные и будут совместно использоваться каждым из объектов класса PortDataState)
  2. _root, _map - какие-то "защищенные" члены (если ваша среда IDE, например PyCharm, предупреждает вас, что эти члены защищаются, если вы пытаетесь получить доступ к одному из этих членов вне класса). Но на самом деле во время исполнения Python не мешает вам получить доступ к элементам начинается с символа "_". (Так что это только конвенция).
  3. link_prev, first и т.д. не будут представлены в объекте, потому что он не запускается с ключевым словом self. self является самим объектом.


__init__ инициализирует пользовательский класс, чтобы он мог использоваться по назначению.

В этом примере,

  • вызывается __init__ суперкласса
  • атрибуты _root и _map инициализированного объекта (который является self) устанавливаются таким образом, чтобы их можно было использовать позже другими способами.

Эта функция называется созданием нового объекта (экземпляра) этого класса.

Что происходит с

self.ports = PortDataState() # Port class -> PortData class

заключается в том, что создается новый объект класса PortDataState, поэтому вызывается метод __init__.


Я хочу знать, что содержит self.ports?

Python имеет очень полезную функцию dir(). Если вы хотите получить содержимое объекта, напишите это:

print dir(self.ports)

licensed under cc by-sa 3.0 with attribution.