我在下面给出了类PortDataState的以下python代码。
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]
# doubly 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包含什么?我真的不知道PortDataState的__init__
函数在上面做了什么。具体是什么呢?
def __init__(self):
super(PortDataState, self).__init__()
self._root = root = [] # sentinel node
root[:] = [root, root, None] # [_PREV, _NEXT, _KEY]
# doubly linked list
self._map = {}
意思?
答案 0 :(得分:3)
__init__
函数是与任何其他语言一样的构造函数方法。此方法初始化类字段(但__init__
方法不是创建对象本身,__init__
仅在创建对象后创建对象。写入PortDataState()时(即对象实例化时),会自动执行对象创建。
至于你的case对象,self.ports将包含 dict 包含的所有方法和变量(因为PortDataStates继承自dict)。此外,您的对象将包含:
_PREV
,_NEXT
,_KEY
变量(它是一个静态变量,将在PortDataState类的每个对象之间共享)_root
,_map
- 某种"受保护的"成员(如果您使用IDE,例如PyCharm,它会警告您,如果您尝试访问其中一个成员,则会保护此成员)。但实际上在执行期间,Python不会阻止您使用" _"来阻止您访问成员。焦炭。 (所以它是唯一的惯例)。link_prev
,first
等不会在对象中显示,因为它不是以关键字self
开头的。 self
本身就是对象。答案 1 :(得分:2)
__init__
初始化用户定义的类,以便可以按预期使用。
在此示例中,
__init__
_root
和_map
属性(self
),以便稍后在其他方法中使用它们。在实例化此类的新对象(实例)时调用该函数。
会发生什么
self.ports = PortDataState() # Port class -> PortData class
是实例化类PortDataState
的新对象,因此调用__init__
方法。
答案 2 :(得分:1)
我想知道self.ports包含什么?
Python具有非常有用的dir()
功能。
如果你想获得对象内容,请写下:
print dir(self.ports)