Создание экземпляра объекта в 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.