Python中的对象实例化

2024-04-20 10:25:32 发布

您现在位置:Python中文网/ 问答频道 /正文

下面给出了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的一个对象,如下所示

^{pr2}$

我对Python很陌生,我想知道什么是Python自身端口包含?我真的不明白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 = {}

卑鄙?在


Tags: keyselfmapdatamoveisportdef
3条回答

I want to know what does self.ports contain?

Python有非常有用的dir()函数。 如果要获取对象内容,请写下:

print dir(self.ports)

Python中的__init__函数和其他语言一样是构造函数方法。此方法初始化类字段(但是__init__方法不是创建对象本身,__init__只在对象被创建后修改)。在write PortDataState()时(即对象实例化时)自动执行对象创建。在

至于你的案件对象自身端口将包含dict类包含的所有方法和变量(因为PortDataStates继承自dict)。此外,您的对象将包含:

  1. _PREV_NEXT_KEY变量(它是一个静态变量,将在PortDataState类的每个对象之间共享)
  2. _root_map-某种“受保护”的成员(如果您使用IDE,例如PyCharm,它会警告您,如果您试图在类之外访问这些成员之一,那么这些成员将受到保护)。但实际上在执行过程中Python并没有阻止您访问以“”字符开头的成员。(所以这只是惯例)。在
  3. link_prevfirst等不会出现在对象中,因为它不是以关键字self开头的。self是对象本身。在

__init__初始化用户定义的类,以便可以按预期使用它。在

在这个例子中

  • 超类的__init__被调用
  • 要初始化的对象(即self)的_root_map属性被设置,以便以后可以在其他方法中使用它们。在

在实例化此类的新对象(实例)时调用该函数。在

怎么了

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

是实例化了PortDataState类的一个新对象,因此调用了__init__方法。在

相关问题 更多 >