Python中的对象实例化

时间:2014-04-22 07:31:55

标签: 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的对象,如下所示

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 = {}

意思?

3 个答案:

答案 0 :(得分:3)

Python中的

__init__函数是与任何其他语言一样的构造函数方法。此方法初始化类字段(但__init__方法不是创建对象本身,__init__仅在创建对象后创建对象。写入PortDataState()时(即对象实例化时),会自动执行对象创建。

至于你的case对象,self.ports将包含 dict 包含的所有方法和变量(因为PortDataStates继承自dict)。此外,您的对象将包含:

  1. _PREV_NEXT_KEY变量(它是一个静态变量,将在PortDataState类的每个对象之间共享)
  2. _root_map - 某种"受保护的"成员(如果您使用IDE,例如PyCharm,它会警告您,如果您尝试访问其中一个成员,则会保护此成员)。但实际上在执行期间,Python不会阻止您使用" _"来阻止您访问成员。焦炭。 (所以它是唯一的惯例)。
  3. link_prevfirst等不会在对象中显示,因为它不是以关键字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)