第七章:Python基础のXML操作和面向对象(一)

本課主題

  • XML介绍与操作实战
  • shutil 模块介绍与操作实战
  • subprocess 模块介绍与操作实战
  • 初探面向对象与操作实战
  • 本周作业

 

XML介绍和操作实战

對於浏览器返回的字符串有以下幾種:

  1. HTML
  2. JSON,表现是列表和字典的格式
  3. XML

XML的應用

一个属性里包含多过属性,一类是页面上做展示的时候可以用到XML,就是为别人来调用(这也是字符串类型的一个XML格式数据);另外一类是配置文件。你可以从文件里打开一个XML文件,它返回的是一个XML形式的字符串;也可以通过发送 HTTP请求,返回一个 XML 形式的字符串

XML函数功能

class Element:
    """An XML element.

    This class is the reference implementation of the Element interface.

    An element's length is its number of subelements.  That means if you
    want to check if an element is truly empty, you should check BOTH
    its length AND its text attribute.

    The element tag, attribute names, and attribute values can be either
    bytes or strings.

    *tag* is the element name.  *attrib* is an optional dictionary containing
    element attributes. *extra* are additional element attributes given as
    keyword arguments.

    Example form:
        text...tail

    """

    当前节点的标签名
    tag = None
    """The element's name."""

    当前节点的属性

    attrib = None
    """Dictionary of the element's attributes."""

    当前节点的内容
    text = None
    """
    Text before first subelement. This is either a string or the value None.
    Note that if there is no text, this attribute may be either
    None or the empty string, depending on the parser.

    """

    tail = None
    """
    Text after this element's end tag, but before the next sibling element's
    start tag.  This is either a string or the value None.  Note that if there
    was no text, this attribute may be either None or an empty string,
    depending on the parser.

    """

    def __init__(self, tag, attrib={}, **extra):
        if not isinstance(attrib, dict):
            raise TypeError("attrib must be dict, not %s" % (
                attrib.__class__.__name__,))
        attrib = attrib.copy()
        attrib.update(extra)
        self.tag = tag
        self.attrib = attrib
        self._children = []

    def __repr__(self):
        return "<%s %r at %#x>" % (self.__class__.__name__, self.tag, id(self))

    def makeelement(self, tag, attrib):
        创建一个新节点
        """Create a new element with the same type.

        *tag* is a string containing the element name.
        *attrib* is a dictionary containing the element attributes.

        Do not call this method, use the SubElement factory function instead.

        """
        return self.__class__(tag, attrib)

    def copy(self):
        """Return copy of current element.

        This creates a shallow copy. Subelements will be shared with the
        original tree.

        """
        elem = self.makeelement(self.tag, self.attrib)
        elem.text = self.text
        elem.tail = self.tail
        elem[:] = self
        return elem

    def __len__(self):
        return len(self._children)

    def __bool__(self):
        warnings.warn(
            "The behavior of this method will change in future versions.  "
            "Use specific 'len(elem)' or 'elem is not None' test instead.",
            FutureWarning, stacklevel=2
            )
        return len(self._children) != 0 # emulate old behaviour, for now

    def __getitem__(self, index):
        return self._children[index]

    def __setitem__(self, index, element):
        # if isinstance(index, slice):
        #     for elt in element:
        #         assert iselement(elt)
        # else:
        #     assert iselement(element)
        self._children[index] = element

    def __delitem__(self, index):
        del self._children[index]

    def append(self, subelement):
        为当前节点追加一个子节点
        """Add *subelement* to the end of this element.

        The new element will appear in document order after the last existing
        subelement (or directly after the text, if it's the first subelement),
        but before the end tag for this element.

        """
        self._assert_is_element(subelement)
        self._children.append(subelement)

    def extend(self, elements):
        为当前节点扩展 n 个子节点
        """Append subelements from a sequence.

        *elements* is a sequence with zero or more elements.

        """
        for element in elements:
            self._assert_is_element(element)
        self._children.extend(elements)

    def insert(self, index, subelement):
        在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置
        """Insert *subelement* at position *index*."""
        self._assert_is_element(subelement)
        self._children.insert(index, subelement)

    def _assert_is_element(self, e):
        # Need to refer to the actual Python implementation, not the
        # shadowing C implementation.
        if not isinstance(e, _Element_Py):
            raise TypeError('expected an Element, not %s' % type(e).__name__)

    def remove(self, subelement):
        在当前节点在子节点中删除某个节点
        """Remove matching subelement.

        Unlike the find methods, this method compares elements based on
        identity, NOT ON tag value or contents.  To remove subelements by
        other means, the easiest way is to use a list comprehension to
        select what elements to keep, and then use slice assignment to update
        the parent element.

        ValueError is raised if a matching element could not be found.

        """
        # assert iselement(element)
        self._children.remove(subelement)

    def getchildren(self):
        获取所有的子节点(废弃)
        """(Deprecated) Return all subelements.

        Elements are returned in document order.

        """
        warnings.warn(
            "This method will be removed in future versions.  "
            "Use 'list(elem)' or iteration over elem instead.",
            DeprecationWarning, stacklevel=2
            )
        return self._children

    def find(self, path, namespaces=None):
        获取第一个寻找到的子节点
        """Find first matching element by tag name or path.

        *path* is a string having either an element tag or an XPath,
        *namespaces* is an optional mapping from namespace prefix to full name.

        Return the first matching element, or None if no element was found.

        """
        return ElementPath.find(self, path, namespaces)

    def findtext(self, path, default=None, namespaces=None):
        获取第一个寻找到的子节点的内容
        """Find text for first matching element by tag name or path.

        *path* is a string having either an element tag or an XPath,
        *default* is the value to return if the element was not found,
        *namespaces* is an optional mapping from namespace prefix to full name.

        Return text content of first matching element, or default value if
        none was found.  Note that if an element is found having no text
        content, the empty string is returned.

        """
        return ElementPath.findtext(self, path, default, namespaces)

    def findall(self, path, namespaces=None):
        获取所有的子节点
        """Find all matching subelements by tag name or path.

        *path* is a string having either an element tag or an XPath,
        *namespaces* is an optional mapping from namespace prefix to full name.

        Returns list containing all matching elements in document order.

        """
        return ElementPath.findall(self, path, namespaces)

    def iterfind(self, path, namespaces=None):
        获取所有指定的节点,并创建一个迭代器(可以被for循环)
        """Find all matching subelements by tag name or path.

        *path* is a string having either an element tag or an XPath,
        *namespaces* is an optional mapping from namespace prefix to full name.

        Return an iterable yielding all matching elements in document order.

        """
        return ElementPath.iterfind(self, path, namespaces)

    def clear(self):
        清空节点
        """Reset element.

        This function removes all subelements, clears all attributes, and sets
        the text and tail attributes to None.

        """
        self.attrib.clear()
        self._children = []
        self.text = self.tail = None

    def get(self, key, default=None):
        获取当前节点的属性值
        """Get element attribute.

        Equivalent to attrib.get, but some implementations may handle this a
        bit more efficiently.  *key* is what attribute to look for, and
        *default* is what to return if the attribute was not found.

        Returns a string containing the attribute value, or the default if
        attribute was not found.

        """
        return self.attrib.get(key, default)

    def set(self, key, value):
        为当前节点设置属性值
        """Set element attribute.

        Equivalent to attrib[key] = value, but some implementations may handle
        this a bit more efficiently.  *key* is what attribute to set, and
        *value* is the attribute value to set it to.

        """
        self.attrib[key] = value

    def keys(self):
        获取当前节点的所有属性的 key

        """Get list of attribute names.

        Names are returned in an arbitrary order, just like an ordinary
        Python dict.  Equivalent to attrib.keys()

        """
        return self.attrib.keys()

    def items(self):
        获取当前节点的所有属性值,每个属性都是一个键值对
        """Get element attributes as a sequence.

        The attributes are returned in arbitrary order.  Equivalent to
        attrib.items().

        Return a list of (name, value) tuples.

        """
        return self.attrib.items()

    def iter(self, tag=None):
        在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。
        """Create tree iterator.

        The iterator loops over the element and all subelements in document
        order, returning all elements with a matching tag.

        If the tree structure is modified during iteration, new or removed
        elements may or may not be included.  To get a stable set, use the
        list() function on the iterator, and loop over the resulting list.

        *tag* is what tags to look for (default is to return all elements)

        Return an iterator containing all the matching elements.

        """
        if tag == "*":
            tag = None
        if tag is None or self.tag == tag:
            yield self
        for e in self._children:
            yield from e.iter(tag)

    # compatibility
    def getiterator(self, tag=None):
        # Change for a DeprecationWarning in 1.4
        warnings.warn(
            "This method will be removed in future versions.  "
            "Use 'elem.iter()' or 'list(elem.iter())' instead.",
            PendingDeprecationWarning, stacklevel=2
        )
        return list(self.iter(tag))

    def itertext(self):
        在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。
        """Create text iterator.

        The iterator loops over the element and all subelements in document
        order, returning all inner text.

        """
        tag = self.tag
        if not isinstance(tag, str) and tag is not None:
            return
        if self.text:
            yield self.text
        for e in self:
            yield from e.itertext()
            if e.tail:
                yield e.tail

节点功能一览表
节点功能一览表

每一个节点都是一个 element 对象,节点里可以嵌套节点;这里的 book.xml 例子有 <书>:每本书分別都有<书名>,<作者>,<出版年份> 和 <价格> 4个属性。

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italiantitle>
    <author>Giada De Laurentiisauthor>
    <year>2005year>
    <price>30.00price>
  book>
  <book category="children">
    <title lang="en">Harry Pottertitle>
    <author>J K. Rowlingauthor>
    <year>2005year>
    <price>29.99price>
  book>
  <book category="web">
    <title lang="en">Learning XMLtitle>
    <author>Erik T. Rayauthor>
    <year>2003year>
    <price>39.95price>
  book>
bookstore>
Book.xml
  1. 把整个XML文件的树先取出来放在一个XML对象里,加载到内存里,它返回的是一个ElementTree 里的 ElementTree类型
    >>> from xml.etree import ElementTree as ET
    >>> xmltree = ET.parse('book.xml')
    >>> print(type(xmltree))
    <class 'xml.etree.ElementTree.ElementTree'>
    ET.parse()
  2. 如果你想取它的根目录的话,调用getroot( )函数,它返回的是一个ElementTree 里的 Element类型 
    >>> xmltree = ET.parse('book.xml')
    >>> root = xmltree.getroot()
    >>> print(root)
    'bookstore' at 0x10d065868>
    
    >>> print(type(root))
    <class 'xml.etree.ElementTree.Element'>
    getroot()例子
  3. 用的 open( )函数打开一个XML文件,它返回的是XML形式的字符串,然后通过调用XML( )函数来读取/操作出XML格式的文件,它返回的也是一个 ElementTree 里的Element类型
    >>> str_xmltree = open('book.xml','r').read() # 返回XML形式的字符串
    >>> print(type(str_xmltree))
    <class 'str'>
    
    >>> root = ET.XML(str_xmltree)
    >>> print(root)
    'bookstore' at 0x10d06eb88>
    
    >>> print(type(root)) 
    <class 'xml.etree.ElementTree.Element'>
    ET.XML()例子
  4. 取出XML文件的 tag element,一個XML文件可以有很多 tag,tag 是構成XML格式的重要元素。 比如在上面 bookstore 的例子里,tag 分別是 、<author>、<year>、<price></span>,如果想找到一個 XML 的 Tag,就可以調用 tag变量來找。<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_67e3e87b-6d25-4d67-8de0-6b84040c783d" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_67e3e87b-6d25-4d67-8de0-6b84040c783d" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_67e3e87b-6d25-4d67-8de0-6b84040c783d" class="cnblogs_code_hide"> <pre>>>> xmltree = ET.parse(<span style="color:#800000;">'</span><span style="color:#800000;">book.xml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span>>>> root =<span style="color:#000000;"> xmltree.getroot() </span>>>> <span style="color:#0000ff;">print</span>(root.tag) <span style="color:#008000;">#</span><span style="color:#008000;"> 调用 tag 函数</span> <span style="color:#000000;">bookstore </span>>>> <span style="color:#0000ff;">for</span> child <span style="color:#0000ff;">in</span> root: <span style="color:#008000;">#</span><span style="color:#008000;">下一层也有下一层的Tag</span> ... <span style="color:#0000ff;">print</span><span style="color:#000000;">(child.tag) ... book book book </span>>>> <span style="color:#0000ff;">for</span> child <span style="color:#0000ff;">in</span> root: <span style="color:#008000;">#</span><span style="color:#008000;">下一层也有下一层的Tag</span> ... <span style="color:#0000ff;">print</span><span style="color:#000000;">(child.tag) ... </span><span style="color:#0000ff;">for</span> grandchild <span style="color:#0000ff;">in</span><span style="color:#000000;"> child: ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(child.tag, grandchild.tag) ... book book title book author book year book price book book title book author book year book price book book title book author book year book price</span></pre> </div> <span class="cnblogs_code_collapse">tag变量</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">取出XML文件Tag中的metadata/attribue,例如: <book <span style="color:#0000ff;">category="cooking"</span>>,catergory = "cooking" 就是調用以下函数可以拿到的,返回的是一个<strong><span style="color:#993300;">字典</span></strong>类型。<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_20ccd2cc-a114-40e7-b779-d5021f64234d" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_20ccd2cc-a114-40e7-b779-d5021f64234d" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_20ccd2cc-a114-40e7-b779-d5021f64234d" class="cnblogs_code_hide"> <pre>>>> xmltree = ET.parse(<span style="color:#800000;">'</span><span style="color:#800000;">book.xml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span>>>> root =<span style="color:#000000;"> xmltree.getroot() </span>>>> <span style="color:#0000ff;">for</span> child <span style="color:#0000ff;">in</span><span style="color:#000000;"> root: ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(child.tag, child.attrib,type(child.attrib)) ... book {</span><span style="color:#800000;">'</span><span style="color:#800000;">category</span><span style="color:#800000;">'</span>: <span style="color:#800000;">'</span><span style="color:#800000;">cooking</span><span style="color:#800000;">'</span>} <<span style="color:#0000ff;">class</span> <span style="color:#800000;">'</span><span style="color:#800000;">dict</span><span style="color:#800000;">'</span>><span style="color:#000000;"> book {</span><span style="color:#800000;">'</span><span style="color:#800000;">category</span><span style="color:#800000;">'</span>: <span style="color:#800000;">'</span><span style="color:#800000;">children</span><span style="color:#800000;">'</span>} <<span style="color:#0000ff;">class</span> <span style="color:#800000;">'</span><span style="color:#800000;">dict</span><span style="color:#800000;">'</span>><span style="color:#000000;"> book {</span><span style="color:#800000;">'</span><span style="color:#800000;">category</span><span style="color:#800000;">'</span>: <span style="color:#800000;">'</span><span style="color:#800000;">web</span><span style="color:#800000;">'</span>} <<span style="color:#0000ff;">class</span> <span style="color:#800000;">'</span><span style="color:#800000;">dict</span><span style="color:#800000;">'</span>></pre> </div> <span class="cnblogs_code_collapse">attrib变量</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;">想取出 Tag 裡值的話,例如: <author><span style="color:#0000ff;">Giada De Laurentiis</span></author>,可以調用 text变量<br></span></span></span> <div class="cnblogs_code"> <img id="code_img_closed_d2c2f88a-34fb-412a-902c-d3d877092361" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_d2c2f88a-34fb-412a-902c-d3d877092361" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_d2c2f88a-34fb-412a-902c-d3d877092361" class="cnblogs_code_hide"> <pre>>>> xmltree = ET.parse(<span style="color:#800000;">'</span><span style="color:#800000;">book.xml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span>>>> root =<span style="color:#000000;"> xmltree.getroot() </span>>>> <span style="color:#0000ff;">for</span> child <span style="color:#0000ff;">in</span><span style="color:#000000;"> root: ... </span><span style="color:#0000ff;">for</span> grandchild <span style="color:#0000ff;">in</span><span style="color:#000000;"> child: ... </span><span style="color:#0000ff;">print</span>(child.tag+<span style="color:#800000;">"</span><span style="color:#800000;">-</span><span style="color:#800000;">"</span>+grandchild.tag+<span style="color:#800000;">"</span><span style="color:#800000;">:</span><span style="color:#800000;">"</span><span style="color:#000000;">, grandchild.text) ... book</span>-<span style="color:#000000;">title: Everyday Italian book</span>-<span style="color:#000000;">author: Giada De Laurentiis book</span>-year: 2005<span style="color:#000000;"> book</span>-price: 30.00<span style="color:#000000;"> book</span>-<span style="color:#000000;">title: Harry Potter book</span>-<span style="color:#000000;">author: J K. Rowling book</span>-year: 2005<span style="color:#000000;"> book</span>-price: 29.99<span style="color:#000000;"> book</span>-<span style="color:#000000;">title: Learning XML book</span>-<span style="color:#000000;">author: Erik T. Ray book</span>-year: 2003<span style="color:#000000;"> book</span>-price: 39.95</pre> </div> <span class="cnblogs_code_collapse">text变量</span> </div> </li> <li> <p><span style="font-size:12px;">如何生成新的XML文件<br></span></p> </li> <li> <p><span style="font-size:12px;">如何创建节点</span></p> </li> <li> <p><span style="font-size:12px;">如何创建XML</span></p> </li> </ol> <p> </p> <div class="cnblogs_code"> <img id="code_img_closed_5ae45fe2-eabe-435c-82e7-60401226cf79" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_5ae45fe2-eabe-435c-82e7-60401226cf79" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_5ae45fe2-eabe-435c-82e7-60401226cf79" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;"><</span><span style="color:#800000;">data </span><span style="color:#ff0000;">title</span><span style="color:#0000ff;">="'CTO"</span><span style="color:#ff0000;"> age</span><span style="color:#0000ff;">="50"</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">country </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="Liechtenstein"</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">rank </span><span style="color:#ff0000;">updated</span><span style="color:#0000ff;">="yes"</span><span style="color:#0000ff;">></span>2<span style="color:#0000ff;"></</span><span style="color:#800000;">rank</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">year</span><span style="color:#0000ff;">></span>2023<span style="color:#0000ff;"></</span><span style="color:#800000;">year</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">gdppc</span><span style="color:#0000ff;">></span>141100<span style="color:#0000ff;"></</span><span style="color:#800000;">gdppc</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">neighbor </span><span style="color:#ff0000;">direction</span><span style="color:#0000ff;">="E"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="Austria"</span> <span style="color:#0000ff;">/></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">neighbor </span><span style="color:#ff0000;">direction</span><span style="color:#0000ff;">="W"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="Switzerland"</span> <span style="color:#0000ff;">/></span> <span style="color:#0000ff;"></</span><span style="color:#800000;">country</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">country </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="Singapore"</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">rank </span><span style="color:#ff0000;">updated</span><span style="color:#0000ff;">="yes"</span><span style="color:#0000ff;">></span>5<span style="color:#0000ff;"></</span><span style="color:#800000;">rank</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">year</span><span style="color:#0000ff;">></span>2026<span style="color:#0000ff;"></</span><span style="color:#800000;">year</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">gdppc</span><span style="color:#0000ff;">></span>59900<span style="color:#0000ff;"></</span><span style="color:#800000;">gdppc</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">neighbor </span><span style="color:#ff0000;">direction</span><span style="color:#0000ff;">="N"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="Malaysia"</span> <span style="color:#0000ff;">/></span> <span style="color:#0000ff;"></</span><span style="color:#800000;">country</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">country </span><span style="color:#ff0000;">name</span><span style="color:#0000ff;">="Panama"</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">rank </span><span style="color:#ff0000;">updated</span><span style="color:#0000ff;">="yes"</span><span style="color:#0000ff;">></span>69<span style="color:#0000ff;"></</span><span style="color:#800000;">rank</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">year</span><span style="color:#0000ff;">></span>2026<span style="color:#0000ff;"></</span><span style="color:#800000;">year</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">gdppc</span><span style="color:#0000ff;">></span>13600<span style="color:#0000ff;"></</span><span style="color:#800000;">gdppc</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">neighbor </span><span style="color:#ff0000;">direction</span><span style="color:#0000ff;">="W"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="Costa Rica"</span> <span style="color:#0000ff;">/></span> <span style="color:#0000ff;"><</span><span style="color:#800000;">neighbor </span><span style="color:#ff0000;">direction</span><span style="color:#0000ff;">="E"</span><span style="color:#ff0000;"> name</span><span style="color:#0000ff;">="Colombia"</span> <span style="color:#0000ff;">/></span> <span style="color:#0000ff;"></</span><span style="color:#800000;">country</span><span style="color:#0000ff;">></span> <span style="color:#0000ff;"></</span><span style="color:#800000;">data</span><span style="color:#0000ff;">></span></pre> </div> <span class="cnblogs_code_collapse">xo.xml</span> </div> <div class="cnblogs_code"> <img id="code_img_closed_fbfd915c-8ddf-49cd-985c-ccd0d6abcb5f" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_fbfd915c-8ddf-49cd-985c-ccd0d6abcb5f" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_fbfd915c-8ddf-49cd-985c-ccd0d6abcb5f" class="cnblogs_code_hide"> <pre>>>> <span style="color:#0000ff;">from</span> xml.etree <span style="color:#0000ff;">import</span><span style="color:#000000;"> ElementTree as ET </span>>>> tree = ET.parse(<span style="color:#800000;">'</span><span style="color:#800000;">xo.xml</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span>>>> root =<span style="color:#000000;"> tree.getroot() </span>>>> <span style="color:#0000ff;">for</span> child <span style="color:#0000ff;">in</span><span style="color:#000000;"> root: ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(child.tag,child.attrib) ... </span><span style="color:#0000ff;">for</span> grandchild <span style="color:#0000ff;">in</span><span style="color:#000000;"> child: ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(grandchild.tag,grandchild.text) ... country {</span><span style="color:#800000;">'</span><span style="color:#800000;">name</span><span style="color:#800000;">'</span>: <span style="color:#800000;">'</span><span style="color:#800000;">Liechtenstein</span><span style="color:#800000;">'</span><span style="color:#000000;">} rank </span>2<span style="color:#000000;"> year </span>2023<span style="color:#000000;"> gdppc </span>141100<span style="color:#000000;"> neighbor None neighbor None country {</span><span style="color:#800000;">'</span><span style="color:#800000;">name</span><span style="color:#800000;">'</span>: <span style="color:#800000;">'</span><span style="color:#800000;">Singapore</span><span style="color:#800000;">'</span><span style="color:#000000;">} rank </span>5<span style="color:#000000;"> year </span>2026<span style="color:#000000;"> gdppc </span>59900<span style="color:#000000;"> neighbor None country {</span><span style="color:#800000;">'</span><span style="color:#800000;">name</span><span style="color:#800000;">'</span>: <span style="color:#800000;">'</span><span style="color:#800000;">Panama</span><span style="color:#800000;">'</span><span style="color:#000000;">} rank </span>69<span style="color:#000000;"> year </span>2026<span style="color:#000000;"> gdppc </span>13600<span style="color:#000000;"> neighbor None neighbor None</span></pre> </div> <span class="cnblogs_code_collapse">XML例子</span> </div> <p> </p> <h2>shutil 模块介绍和操作实战</h2> <p><span style="font-size:12px;">这个模块主要是为了处理文件、文件夹和压缩文件,它文件內容,權限,文件夾嵌套文件夾、壓縮文件的處理。</span></p> <p><span style="font-size:12px;">文件操作:打开文件以及读写文件</span></p> <ol> <li><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;">拷贝文件:從一個文件拷贝到另外一個文件,这里接受的是一个文件<span style="color:#993300;"><strong>对象</strong> </span> </span></span></span></span></span><span style="font-size:12px;"><class '_io.TextIOWrapper'></span> <div class="cnblogs_code"> <img id="code_img_closed_f8f71169-3ba2-48ae-8dbe-4233f254fce5" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_f8f71169-3ba2-48ae-8dbe-4233f254fce5" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_f8f71169-3ba2-48ae-8dbe-4233f254fce5" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shutil </span><span style="color:#008000;">#</span><span style="color:#008000;"> Copy a file from source to destination</span> src = open(<span style="color:#800000;">"</span><span style="color:#800000;">src.txt</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">r</span><span style="color:#800000;">"</span>) <span style="color:#008000;">#</span><span style="color:#008000;"><class '_io.TextIOWrapper'></span> dest = open(<span style="color:#800000;">"</span><span style="color:#800000;">dest.txt</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">w</span><span style="color:#800000;">"</span>) <span style="color:#008000;">#</span><span style="color:#008000;"><class '_io.TextIOWrapper'></span> <span style="color:#000000;"> shutil.copyfileobj(src,dest)</span></pre> </div> <span class="cnblogs_code_collapse">拷贝文件(方法一)</span> </div> </li> <li><span style="font-size:12px;">拷贝文件:從一個文件拷贝到另外一個文件,这里接受的是一个文件<span style="color:#993300;"><strong>字符串</strong></span></span><br> <div class="cnblogs_code"> <img id="code_img_closed_7d08de5a-7c0b-4f73-b161-bed0ecebd199" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_7d08de5a-7c0b-4f73-b161-bed0ecebd199" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_7d08de5a-7c0b-4f73-b161-bed0ecebd199" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shutil </span><span style="color:#008000;">#</span><span style="color:#008000;"> Copy a file from source to destination</span> shutil.copyfile(<span style="color:#800000;">"</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">f2.log</span><span style="color:#800000;">"</span>)</pre> </div> <span class="cnblogs_code_collapse">拷贝文件(方法二)</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">只拷贝文件的权限<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_6d61eb6b-b8dd-436c-94e7-8883477d72aa" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_6d61eb6b-b8dd-436c-94e7-8883477d72aa" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_6d61eb6b-b8dd-436c-94e7-8883477d72aa" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shutil shutil.copymode(</span><span style="color:#800000;">"</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">f2.log</span><span style="color:#800000;">"</span>)</pre> </div> <span class="cnblogs_code_collapse">拷贝文件权限</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">拷贝状态的信息,包括:mode bits, atime, mtime, flags</span></span> <div class="cnblogs_code"> <img id="code_img_closed_e7771532-111b-4812-9ab1-1958a7468691" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_e7771532-111b-4812-9ab1-1958a7468691" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_e7771532-111b-4812-9ab1-1958a7468691" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shut shutil.copystat(</span><span style="color:#800000;">"</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">f2.log</span><span style="color:#800000;">"</span>)</pre> </div> <span class="cnblogs_code_collapse">拷贝文件</span> </div> </li> <li><span style="font-size:12px;">拷贝文件和权限</span><br> <div class="cnblogs_code"> <img id="code_img_closed_085b64f5-74bc-42f4-9681-88bc722f0dc3" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_085b64f5-74bc-42f4-9681-88bc722f0dc3" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_085b64f5-74bc-42f4-9681-88bc722f0dc3" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shutil shutil.copy(</span><span style="color:#800000;">'</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">f2.log</span><span style="color:#800000;">'</span>)</pre> </div> <span class="cnblogs_code_collapse">拷贝文件和权限</span> </div> </li> <li><span style="font-size:12px;">拷贝文件和状态信息</span><br> <div class="cnblogs_code"> <img id="code_img_closed_1e1518a2-4ae4-4593-928b-bb0b164a71ef" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_1e1518a2-4ae4-4593-928b-bb0b164a71ef" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_1e1518a2-4ae4-4593-928b-bb0b164a71ef" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shutil shutil.copy2(</span><span style="color:#800000;">'</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">f2.log</span><span style="color:#800000;">'</span>)</pre> </div> <span class="cnblogs_code_collapse">拷贝文件和状态信息</span> </div> </li> <li><span style="font-size:12px;">递归的去拷贝文件夹</span><br> <div class="cnblogs_code"> <img id="code_img_closed_ac2397c8-77e1-4bcc-9f11-a5e14a00feb3" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_ac2397c8-77e1-4bcc-9f11-a5e14a00feb3" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_ac2397c8-77e1-4bcc-9f11-a5e14a00feb3" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shutil shutil.copytree(</span><span style="color:#800000;">'</span><span style="color:#800000;">folder1</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">folder2</span><span style="color:#800000;">'</span>, ignore=shutil.ignore_patterns(<span style="color:#800000;">'</span><span style="color:#800000;">*.pyc</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">tmp*</span><span style="color:#800000;">'</span>))</pre> </div> <span class="cnblogs_code_collapse">递归的去拷贝文件夹</span> </div> </li> <li><span style="font-size:12px;">递归的去移动文件,它类似mv命令,其实就是重命名</span><br> <div class="cnblogs_code"> <img id="code_img_closed_e800b8e1-d92c-4f93-ac3c-b08ddec3dbc3" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_e800b8e1-d92c-4f93-ac3c-b08ddec3dbc3" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_e800b8e1-d92c-4f93-ac3c-b08ddec3dbc3" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> shutil shutil.move(</span><span style="color:#800000;">'</span><span style="color:#800000;">folder1</span><span style="color:#800000;">'</span>, <span style="color:#800000;">'</span><span style="color:#800000;">folder3</span><span style="color:#800000;">'</span>)</pre> </div> <span class="cnblogs_code_collapse">递归的去移动文件</span> </div> </li> <li><span style="font-size:12px;">创建压缩包并返回文件路径</span><br> <div class="cnblogs_Highlighter"> <pre><code class="language-python">shutil.make_archive(base_name, format,...)</code></pre> </div> </li> <li>xxxxx</li> </ol> <h3>Python 的压缩操作</h3> <p><span style="font-size:12px;">对于解压单个文件来说,<strong><span style="color:#993300;"><em>注意:</em><em>zipfile 模块來解压指定文件只需要输入字符串,但 tarfile <em>模块</em>必需传入一个 <class 'tarfile.TarInfo'>的对象才可以成功解压</em></span></strong>。<br></span></p> <h3><span style="font-size:12px;">zipfile</span></h3> <ol> <li><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;">压缩文件<br></span></span></span> <div class="cnblogs_code"> <img id="code_img_closed_28fdae73-5a7f-49ea-a1fa-9936c5e5626e" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_28fdae73-5a7f-49ea-a1fa-9936c5e5626e" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_28fdae73-5a7f-49ea-a1fa-9936c5e5626e" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> zipfile z </span>= zipfile.ZipFile(<span style="color:#800000;">"</span><span style="color:#800000;">examples.zip</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">w</span><span style="color:#800000;">"</span><span style="color:#000000;">) z.write(</span><span style="color:#800000;">"</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">"</span><span style="color:#000000;">) z.write(</span><span style="color:#800000;">"</span><span style="color:#800000;">f2.log</span><span style="color:#800000;">"</span><span style="color:#000000;">) z.close()</span></pre> </div> <span class="cnblogs_code_collapse">Zip压缩</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;">解压全部文件<br></span></span></span> <div class="cnblogs_code"> <img id="code_img_closed_40a5a687-206e-4d3c-ac2e-c513407c4516" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_40a5a687-206e-4d3c-ac2e-c513407c4516" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_40a5a687-206e-4d3c-ac2e-c513407c4516" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> zipfile z </span>= zipfile.ZipFile(<span style="color:#800000;">"</span><span style="color:#800000;">examples.zip</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">r</span><span style="color:#800000;">"</span><span style="color:#000000;">) z.extractall() z.close()</span></pre> </div> <span class="cnblogs_code_collapse">Zip解压全部</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">解压单个文件,调用 namelist( ) 去找一个压缩文件里有哪些文件 (返回<span style="color:#993300;"><strong>字符串</strong></span>)<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_48297d40-e1f2-4f2d-8c56-628dee23f575" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_48297d40-e1f2-4f2d-8c56-628dee23f575" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_48297d40-e1f2-4f2d-8c56-628dee23f575" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> zipfile z </span>= zipfile.ZipFile(<span style="color:#800000;">"</span><span style="color:#800000;">examples.zip</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">r</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span>(z.namelist()) <span style="color:#008000;">#</span><span style="color:#008000;">['f1.log', 'f2.log']</span> <span style="color:#0000ff;">for</span> item <span style="color:#0000ff;">in</span><span style="color:#000000;"> z.namelist(): </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(item) z.extract(</span><span style="color:#800000;">"</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">"</span><span style="color:#000000;">) z.close()</span></pre> </div> <span class="cnblogs_code_collapse">Zip解压单个文件</span> </div> </li> </ol> <h3><span style="font-size:12px;">tarfile</span></h3> <ol> <li><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;">压缩文件<br></span></span></span> <div class="cnblogs_code"> <img id="code_img_closed_7e6693a6-8575-4d50-91c9-437e5fcd95d6" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_7e6693a6-8575-4d50-91c9-437e5fcd95d6" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_7e6693a6-8575-4d50-91c9-437e5fcd95d6" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> tarfile tar </span>= tarfile.open(<span style="color:#800000;">'</span><span style="color:#800000;">example.tar</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">w</span><span style="color:#800000;">'</span><span style="color:#000000;">) tar.add(</span><span style="color:#800000;">'</span><span style="color:#800000;">f1.log</span><span style="color:#800000;">'</span>, arcname=<span style="color:#800000;">'</span><span style="color:#800000;">access.log</span><span style="color:#800000;">'</span><span style="color:#000000;">) tar.add(</span><span style="color:#800000;">'</span><span style="color:#800000;">f2.log</span><span style="color:#800000;">'</span>, arcname=<span style="color:#800000;">'</span><span style="color:#800000;">error.log</span><span style="color:#800000;">'</span><span style="color:#000000;">) tar.close()</span></pre> </div> <span class="cnblogs_code_collapse">tar压缩文件</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;">解压全部文件<br></span></span></span> <div class="cnblogs_code"> <img id="code_img_closed_35e350d9-b8f2-41f1-9c8f-2a3809673216" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_35e350d9-b8f2-41f1-9c8f-2a3809673216" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_35e350d9-b8f2-41f1-9c8f-2a3809673216" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> tarfile tar </span>= tarfile.open(<span style="color:#800000;">"</span><span style="color:#800000;">example.tar</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">r</span><span style="color:#800000;">"</span><span style="color:#000000;">) tar.extractall() </span><span style="color:#008000;">#</span><span style="color:#008000;"> 可设置解压地址</span> tar.close()</pre> </div> <span class="cnblogs_code_collapse">tar解压全部文件</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">解压单个文件,tarfile 模块在解压单个文件时,只接受一个<span style="color:#993300;"><strong>对象</strong></span>而不是字符串<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_a242e491-c454-41a0-8f8b-d201960b5698" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_a242e491-c454-41a0-8f8b-d201960b5698" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_a242e491-c454-41a0-8f8b-d201960b5698" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> tarfile tar </span>= tarfile.open(<span style="color:#800000;">"</span><span style="color:#800000;">example.tar</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">r</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#008000;">#</span><span style="color:#008000;"> Return a TarInfo object <class 'tarfile.TarInfo'></span> <span style="color:#0000ff;">for</span> item <span style="color:#0000ff;">in</span><span style="color:#000000;"> tar.getmembers(): </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(item,type(item)) </span><span style="color:#008000;">#</span><span style="color:#008000;">传入字符串获取一个对象</span> obj = tar.getmember(<span style="color:#800000;">'</span><span style="color:#800000;">access.log</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span>(obj) <span style="color:#008000;">#</span><span style="color:#008000;"> <TarInfo 'access.log' at 0x1033499a8></span> <span style="color:#000000;"> tar.extract(obj) tar.close()</span></pre> </div> <span class="cnblogs_code_collapse">tar解压单个文件</span> </div> </li> </ol> <h2> </h2> <h2>subprocess 模块介绍和操作实战</h2> <p><span style="font-size:12px;">如果参数 shell=True,第一个参数接受的是数符串;如果参数 shell=False,第一个参数接受的是列表</span></p> <ol> <li><span style="font-size:12px;"><span style="font-size:12px;">返回状态码: subprocess.call( )<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_f72e22b4-5709-4958-a34c-b86d0b2c0d4c" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_f72e22b4-5709-4958-a34c-b86d0b2c0d4c" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_f72e22b4-5709-4958-a34c-b86d0b2c0d4c" class="cnblogs_code_hide"> <pre>>>> ret1 = subprocess.call([<span style="color:#800000;">"</span><span style="color:#800000;">ls</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">-l</span><span style="color:#800000;">"</span>],shell=<span style="color:#000000;">False) </span>-rw-r--r-- 1 jcchoiling staff 535 Sep 17 17:04<span style="color:#000000;"> access.log </span>>>> <span style="color:#0000ff;">print</span><span style="color:#000000;">(ret1) </span>>>> ret2 = subprocess.call([<span style="color:#800000;">"</span><span style="color:#800000;">ls -l</span><span style="color:#800000;">"</span>],shell=<span style="color:#000000;">True) </span>-rw-r--r-- 1 jcchoiling staff 535 Sep 17 17:04<span style="color:#000000;"> access.log </span>>>> <span style="color:#0000ff;">print</span>(ret2)</pre> </div> <span class="cnblogs_code_collapse">subprocess 中的 "ls -la"</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">执行命令,如果执行状态码是0,则返回0,否则抛异常: subprocess.check_call( )</span></span></li> <li><span style="font-size:12px;"><span style="font-size:12px;">执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常: subprocess.check_out( )<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_4e77565a-f8e3-4ac3-b793-1c9601475391" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_4e77565a-f8e3-4ac3-b793-1c9601475391" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_4e77565a-f8e3-4ac3-b793-1c9601475391" class="cnblogs_code_hide"> <pre>>>> <span style="color:#0000ff;">import</span><span style="color:#000000;"> subprocess </span>>>> ret3 = subprocess.check_output([<span style="color:#800000;">"</span><span style="color:#800000;">ls -l</span><span style="color:#800000;">"</span>],shell=<span style="color:#000000;">True) </span>>>><span style="color:#000000;"> ret3 b</span><span style="color:#800000;">'</span><span style="color:#800000;">total 80\n-rw-r--r-- 1 jcchoiling staff 535 Sep 17 17:04 access.log\n-rw-r--r-- 1 jcchoiling staff 1136 Sep 5 22:05 createxmlOps.py\ndrwxr-xr-x 9 jcchoiling staff 306 Sep 17 16:55 data\n-rw-r--r-- 1 jcchoiling staff 535 Sep 17 17:04 error.log\n-rw-r--r-- 1 jcchoiling staff 10240 Sep 17 17:04 example.tar\n-rw-r--r-- 1 jcchoiling staff 615 Sep 17 17:06 s1.py\n-rw-r--r-- 1 jcchoiling staff 198 Sep 17 18:03 s2.py\n-rw-r--r-- 1 jcchoiling staff 938 Sep 5 20:33 xmlOps.py\n-rw-r--r-- 1 jcchoiling staff 361 Sep 17 17:04 zipOps.py\n</span><span style="color:#800000;">'</span> >>><span style="color:#000000;"> type(ret3) </span><<span style="color:#0000ff;">class</span> <span style="color:#800000;">'</span><span style="color:#800000;">bytes</span><span style="color:#800000;">'</span>></pre> </div> <span class="cnblogs_code_collapse">返回內容</span> </div> </li> </ol> <p><span style="font-size:12px;">上面几个方法内部其实也是调用subprocess.Popen( )函数,它相当于创建一些管道,分别是数据输入管道,数据输出管道和输出错误管道</span></p> <p><span style="font-size:12px;"><a href="http://img.e-com-net.com/image/info8/1a984462031643cab098d6b6ccc26fc9.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/1a984462031643cab098d6b6ccc26fc9.jpg" alt="第七章:Python基础のXML操作和面向对象(一)_第1张图片" width="650" height="260" style="border:1px solid black;"></a></span></p> <ol> <li><span style="font-size:12px;"><span style="font-size:12px;"><span style="font-size:12px;">基本的 subprocess.Popen( )函数<br></span></span></span> <div class="cnblogs_code"> <img id="code_img_closed_e690629a-dc5a-4d8d-a4ab-1b46fff5edb8" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_e690629a-dc5a-4d8d-a4ab-1b46fff5edb8" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_e690629a-dc5a-4d8d-a4ab-1b46fff5edb8" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> subprocess ret1 </span>= subprocess.Popen([<span style="color:#800000;">"</span><span style="color:#800000;">mkdir</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">t1</span><span style="color:#800000;">"</span>]) <span style="color:#008000;">#</span><span style="color:#008000;">第一个参数可以是字符串</span> ret2 = subprocess.Popen(<span style="color:#800000;">"</span><span style="color:#800000;">mkdir t2</span><span style="color:#800000;">"</span>, shell=True) <span style="color:#008000;">#</span><span style="color:#008000;">也可以是列表</span></pre> </div> <span class="cnblogs_code_collapse">subprocess.Popen( )基本语法一</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">也可以传入参数,指定特定路径</span></span> <div class="cnblogs_code"> <img id="code_img_closed_9a14e629-6562-418c-9e34-67507d236f41" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_9a14e629-6562-418c-9e34-67507d236f41" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_9a14e629-6562-418c-9e34-67507d236f41" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> subprocess obj </span>= subprocess.Popen(<span style="color:#800000;">"</span><span style="color:#800000;">mkdir t3</span><span style="color:#800000;">"</span>, shell=True, cwd=<span style="color:#800000;">'</span><span style="color:#800000;">/home/dev</span><span style="color:#800000;">'</span>,)</pre> </div> <span class="cnblogs_code_collapse">subprocess.Popen( )基本语法二</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">以下是创建管道的完整代码,首先要创建一个子对象,然后在创建的同时传入一些参数开通这三个管道,在适当的管道里分别写入或读取数据,最后每个管道都必需关闭才是完整<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_2364d1d6-d33b-4d6b-aa3a-110ec92d8797" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_2364d1d6-d33b-4d6b-aa3a-110ec92d8797" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_2364d1d6-d33b-4d6b-aa3a-110ec92d8797" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> subprocess obj </span>= subprocess.Popen([<span style="color:#800000;">"</span><span style="color:#800000;">python</span><span style="color:#800000;">"</span>], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=<span style="color:#000000;">True) obj.stdin.write(</span><span style="color:#800000;">"</span><span style="color:#800000;">print(1)\n</span><span style="color:#800000;">"</span><span style="color:#000000;">) obj.stdin.write(</span><span style="color:#800000;">"</span><span style="color:#800000;">print(2)</span><span style="color:#800000;">"</span><span style="color:#000000;">) obj.stdin.close() cmd_out </span>=<span style="color:#000000;"> obj.stdout.read() obj.stdout.close() cmd_error </span>=<span style="color:#000000;"> obj.stderr.read() obj.stderr.close() </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(cmd_out) </span><span style="color:#0000ff;">print</span>(cmd_error)</pre> </div> <span class="cnblogs_code_collapse">subprocess中的管道通信例子一(完整遍)</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">另外可以調用 communicate( ) 函数来获取输出stdout.read( )和错误的信息。<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_5622d8fb-cff3-4d5f-80b3-02a355a73af8" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_5622d8fb-cff3-4d5f-80b3-02a355a73af8" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_5622d8fb-cff3-4d5f-80b3-02a355a73af8" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> subprocess obj </span>= subprocess.Popen([<span style="color:#800000;">"</span><span style="color:#800000;">python</span><span style="color:#800000;">"</span>], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=<span style="color:#000000;">True) obj.stdin.write(</span><span style="color:#800000;">"</span><span style="color:#800000;">print(1)\n</span><span style="color:#800000;">"</span><span style="color:#000000;">) obj.stdin.write(</span><span style="color:#800000;">"</span><span style="color:#800000;">print(2)</span><span style="color:#800000;">"</span><span style="color:#000000;">) out_error_list </span>=<span style="color:#000000;"> obj.communicate() </span><span style="color:#0000ff;">print</span>(out_error_list)</pre> </div> <span class="cnblogs_code_collapse">subprocess中的管道通信例子二(半简洁遍)</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">最简洁的方式是当创建完一条管道后,直接调用obj.communicate("需要传入的命令") 来完成整个<span style="color:#993300;"><strong>写入、</strong><strong>读取</strong></span><span style="color:#ff0000;"><span style="color:#000000;">和</span><span style="color:#993300;"><strong>关闭</strong></span></span>的过程。</span></span> <div class="cnblogs_code"> <img id="code_img_closed_37f49fe9-431e-4591-af04-be381f43acbe" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_37f49fe9-431e-4591-af04-be381f43acbe" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_37f49fe9-431e-4591-af04-be381f43acbe" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">import</span><span style="color:#000000;"> subprocess obj </span>= subprocess.Popen([<span style="color:#800000;">"</span><span style="color:#800000;">python</span><span style="color:#800000;">"</span>], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=<span style="color:#000000;">True) out_error_list </span>= obj.communicate(<span style="color:#800000;">'</span><span style="color:#800000;">print("hello")</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span>(out_error_list)</pre> </div> <span class="cnblogs_code_collapse">subprocess中的管道通信例子三(简洁遍)</span> </div> </li> </ol> <p>  </p> <h2>初探面向对象与操作实战</h2> <p><span style="font-size:12px;">类是对对象的一些描述,是关于对象的蓝图,它包含方法、属性或者叫成员。</span></p> <p><span style="font-size:12px;">面向对象的目标是代码重用,可以把属性和函数封装到一个类中,也可以把它当作工厂,在每次创建对象时可以确保该对象有相同的属性和方法。</span><span style="font-size:12px;">比如以下例子:创建了一个obj 的对象,这个对象的类型是SQLHelper类,如果基于这个类把 hhost, uusername 和pwd 的参数赋值,此时你可以调用刚才这些参数,然后通过函数打印出来</span></p> <div class="cnblogs_code"> <img id="code_img_closed_07075636-d86c-447d-9043-28965827fc8e" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_07075636-d86c-447d-9043-28965827fc8e" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_07075636-d86c-447d-9043-28965827fc8e" class="cnblogs_code_hide"> <pre>>>> <span style="color:#0000ff;">class</span><span style="color:#000000;"> SQLHelper: ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> fetch(self,sql): ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.hhost) ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.uusername) ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.pwd) ... </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(sql) ... ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> create(self,sql): ... </span><span style="color:#0000ff;">pass</span><span style="color:#000000;"> ... ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> remove(self,nid): ... </span><span style="color:#0000ff;">pass</span><span style="color:#000000;"> ... ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> modify(self,name): ... </span><span style="color:#0000ff;">pass</span><span style="color:#000000;"> ... </span>>>> obj =<span style="color:#000000;"> SQLHelper() </span>>>> obj.hhost = <span style="color:#800000;">'</span><span style="color:#800000;">cl.salt.com</span><span style="color:#800000;">'</span> >>> obj.uusername = <span style="color:#800000;">'</span><span style="color:#800000;">janice</span><span style="color:#800000;">'</span> >>> obj.pwd = <span style="color:#800000;">'</span><span style="color:#800000;">123</span><span style="color:#800000;">'</span> >>> obj.fetch(<span style="color:#800000;">"</span><span style="color:#800000;">Select * from A</span><span style="color:#800000;">"</span><span style="color:#000000;">) cl.salt.com janice </span>123<span style="color:#000000;"> Select </span>* <span style="color:#0000ff;">from</span> A</pre> </div> <span class="cnblogs_code_collapse">面向对象编程一</span> </div> <p><span style="font-size:12px;">优化以上的代码,如果 host, username 和 pwd 是一些共同的参数的话,其实不需要每次创建对象时都把它赋值,因为当创建一个对象的时候,Python 默认会找 __init__ 方法,这个方法我们称之为构造方法。此时,可以把一些通用的参数放在构造方法里,当创建对象时那些参数便会自动创建。</span></p> <div class="cnblogs_code"> <img id="code_img_closed_ffd0586f-7b12-4c1c-a098-78ee991c1bd7" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_ffd0586f-7b12-4c1c-a098-78ee991c1bd7" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_ffd0586f-7b12-4c1c-a098-78ee991c1bd7" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> SQLHelper: </span><span style="color:#008000;">#</span><span style="color:#008000;"> 自动执行</span> <span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">自动执行</span><span style="color:#800000;">"</span><span style="color:#000000;">) self.hhost </span>= <span style="color:#800000;">'</span><span style="color:#800000;">cl.salt.com</span><span style="color:#800000;">'</span><span style="color:#000000;"> self.uusername </span>= <span style="color:#800000;">'</span><span style="color:#800000;">janice</span><span style="color:#800000;">'</span><span style="color:#000000;"> self.pwd </span>= <span style="color:#800000;">'</span><span style="color:#800000;">123</span><span style="color:#800000;">'</span> <span style="color:#008000;">#</span><span style="color:#008000;"> self 是一个形式参数,是自动会给传值的参数</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> fetch(self,sql): </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.hhost) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.uusername) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.pwd) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(sql) </span><span style="color:#008000;">#</span><span style="color:#008000;"> 在类里的函数称之为方法</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> create(self,sql): </span><span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> remove(self,nid): </span><span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> modify(self,name): </span><span style="color:#0000ff;">pass</span><span style="color:#000000;"> obj1 </span>=<span style="color:#000000;"> SQLHelper() </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj1.hhost) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj1.uusername) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj1.pwd) </span><span style="color:#800000;">"""</span><span style="color:#800000;"> 自动执行 cl.salt.com janice 123 </span><span style="color:#800000;">"""</span></pre> </div> <span class="cnblogs_code_collapse">面向对象编程(优化版)无参数遍</span> </div> <p><span style="font-size:12px;">如果每个对象的 hhost, uusername 和 pwd 都不一样的话,也可以在创建对象时,通过传入参数的方式,把数值传进去</span></p> <div class="cnblogs_code"> <img id="code_img_closed_d30632b7-fa43-4176-8b31-e48db9161466" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_d30632b7-fa43-4176-8b31-e48db9161466" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_d30632b7-fa43-4176-8b31-e48db9161466" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> SQLHelper: </span><span style="color:#008000;">#</span><span style="color:#008000;"> 自动执行</span> <span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self,a1,a2,a3): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">自动执行</span><span style="color:#800000;">"</span><span style="color:#000000;">) self.hhost </span>=<span style="color:#000000;"> a1 self.uusername </span>=<span style="color:#000000;"> a2 self.pwd </span>=<span style="color:#000000;"> a3 </span><span style="color:#008000;">#</span><span style="color:#008000;"> self 是一个形式参数,是自动会给传值的参数</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> fetch(self,sql): </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.hhost) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.uusername) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(self.pwd) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(sql) </span><span style="color:#008000;">#</span><span style="color:#008000;"> 在类里的函数称之为方法</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> create(self,sql): </span><span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> remove(self,nid): </span><span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> modify(self,name): </span><span style="color:#0000ff;">pass</span><span style="color:#000000;"> obj1 </span>= SQLHelper(<span style="color:#800000;">'</span><span style="color:#800000;">cl.salt.com</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">janice</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">123</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj1.hhost) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj1.uusername) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj1.pwd) obj2 </span>= SQLHelper(<span style="color:#800000;">'</span><span style="color:#800000;">c2.salt.com</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">alex</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">999</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj2.hhost) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj2.uusername) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj2.pwd) </span><span style="color:#800000;">"""</span><span style="color:#800000;"> 自动执行 cl.salt.com janice 123 自动执行 c2.salt.com alex 999 </span><span style="color:#800000;">"""</span></pre> </div> <span class="cnblogs_code_collapse">面向对象编程(优化版)有参数遍</span> </div> <p><span style="font-size:12px;">面向对象编程的三大特性:</span></p> <ul> <li><span style="font-size:12px;">封装</span></li> <li><span style="font-size:12px;">继承</span></li> <li><span style="font-size:12px;">多态</span></li> </ul> <h3>封装</h3> <p><span style="font-size:12px;">在对象里是可以封装任意类型的数据</span></p> <div class="cnblogs_code"> <img id="code_img_closed_c3603e3f-0838-427f-8f6d-56c664672cc8" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_c3603e3f-0838-427f-8f6d-56c664672cc8" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_c3603e3f-0838-427f-8f6d-56c664672cc8" class="cnblogs_code_hide"> <pre>>>> <span style="color:#0000ff;">class</span><span style="color:#000000;"> f1(): ... </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self,name,obj): ... self.name </span>=<span style="color:#000000;"> name ... self.obj</span>=<span style="color:#000000;">obj ... </span>>>> <span style="color:#0000ff;">class</span><span style="color:#000000;"> f2(): ... </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self,name,age): ... self.name </span>=<span style="color:#000000;"> name ... self.age </span>=<span style="color:#000000;"> age ... </span>>>> f2_obj = f2(<span style="color:#800000;">"</span><span style="color:#800000;">alex</span><span style="color:#800000;">"</span>,11<span style="color:#000000;">) </span>>>> f1_obj = f1(<span style="color:#800000;">"</span><span style="color:#800000;">aa</span><span style="color:#800000;">"</span><span style="color:#000000;">,f2_obj) </span>>>> <span style="color:#0000ff;">print</span><span style="color:#000000;">(f1_obj.obj.age) </span>11 >>> <span style="color:#0000ff;">print</span><span style="color:#000000;">(f1_obj.obj.name) alex </span>>>> <span style="color:#0000ff;">print</span><span style="color:#000000;">(f1_obj.name) aa</span></pre> </div> <span class="cnblogs_code_collapse">对象里封装任意类型的数据</span>  </div> <p><span style="font-size:12px;">课堂练习</span></p> <div class="cnblogs_code"> <img id="code_img_closed_db2dda52-ac3b-4f92-a998-2618c3bd54c3" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_db2dda52-ac3b-4f92-a998-2618c3bd54c3" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_db2dda52-ac3b-4f92-a998-2618c3bd54c3" class="cnblogs_code_hide"> <pre><span style="color:#000000;">练习一:在终端输出如下信息 小明,10岁,男,上山去砍柴 小明,10岁,男,开车去东北 小明,10岁,男,最爱大保健 老李,90岁,男,上山去砍柴 老李,90岁,男,开车去东北 老李,90岁,男,最爱大保健</span></pre> </div> <span class="cnblogs_code_collapse">练习一:在终端输出如下信息</span> </div> <div class="cnblogs_code"> <img id="code_img_closed_5b30e09d-f554-4b15-a23a-273b1df2958f" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_5b30e09d-f554-4b15-a23a-273b1df2958f" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_5b30e09d-f554-4b15-a23a-273b1df2958f" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> Person: </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self,name,age,gender): self.name</span>=<span style="color:#000000;">name self.age</span>=<span style="color:#000000;">age self.gender</span>=<span style="color:#000000;">gender </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> chop_the_wood(self): </span><span style="color:#0000ff;">return</span> <span style="color:#800000;">"</span><span style="color:#800000;">上山去砍柴</span><span style="color:#800000;">"</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> driving(self): </span><span style="color:#0000ff;">return</span> <span style="color:#800000;">"</span><span style="color:#800000;">开车去东北</span><span style="color:#800000;">"</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> keep_fit(self): </span><span style="color:#0000ff;">return</span> <span style="color:#800000;">"</span><span style="color:#800000;">最爱大保健</span><span style="color:#800000;">"</span><span style="color:#000000;"> p1 </span>= Person(<span style="color:#800000;">'</span><span style="color:#800000;">小明</span><span style="color:#800000;">'</span>,10,<span style="color:#800000;">'</span><span style="color:#800000;">男</span><span style="color:#800000;">'</span><span style="color:#000000;">) p2 </span>= Person(<span style="color:#800000;">'</span><span style="color:#800000;">老李</span><span style="color:#800000;">'</span>,90,<span style="color:#800000;">'</span><span style="color:#800000;">男</span><span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span>(p1.name + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> + str(p1.age) + <span style="color:#800000;">"</span><span style="color:#800000;">岁,</span><span style="color:#800000;">"</span> + p1.gender + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> +<span style="color:#000000;"> p1.chop_the_wood()) </span><span style="color:#0000ff;">print</span>(p1.name + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> + str(p1.age) + <span style="color:#800000;">"</span><span style="color:#800000;">岁,</span><span style="color:#800000;">"</span> + p1.gender + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> +<span style="color:#000000;"> p1.driving()) </span><span style="color:#0000ff;">print</span>(p1.name + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> + str(p1.age) + <span style="color:#800000;">"</span><span style="color:#800000;">岁,</span><span style="color:#800000;">"</span> + p1.gender + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> +<span style="color:#000000;"> p1.keep_fit()) </span><span style="color:#0000ff;">print</span>(p2.name + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> + str(p2.age) + <span style="color:#800000;">"</span><span style="color:#800000;">岁,</span><span style="color:#800000;">"</span> + p2.gender + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> +<span style="color:#000000;"> p2.chop_the_wood()) </span><span style="color:#0000ff;">print</span>(p2.name + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> + str(p2.age) + <span style="color:#800000;">"</span><span style="color:#800000;">岁,</span><span style="color:#800000;">"</span> + p2.gender + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> +<span style="color:#000000;"> p2.driving()) </span><span style="color:#0000ff;">print</span>(p2.name + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> + str(p2.age) + <span style="color:#800000;">"</span><span style="color:#800000;">岁,</span><span style="color:#800000;">"</span> + p2.gender + <span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span> + p2.keep_fit())</pre> </div> <span class="cnblogs_code_collapse">练习一代码</span>  </div> <div class="cnblogs_code"> <img id="code_img_closed_4ab8cf46-f550-4ff8-b62d-9d92d1b19103" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_4ab8cf46-f550-4ff8-b62d-9d92d1b19103" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_4ab8cf46-f550-4ff8-b62d-9d92d1b19103" class="cnblogs_code_hide"> <pre>1<span style="color:#000000;">、创建三个游戏人物,分别是: 苍井井,女,</span>18<span style="color:#000000;">,初始战斗力1000 东尼木木,男,</span>20<span style="color:#000000;">,初始战斗力1800 波多多,女,</span>19<span style="color:#000000;">,初始战斗力2500 </span>2<span style="color:#000000;">、游戏场景,分别: 草丛战斗,消耗200战斗力 自我修炼,增长100战斗力 多人游戏,消耗500战斗力</span></pre> </div> <span class="cnblogs_code_collapse">练习二:游戏人生程序</span> </div> <div class="cnblogs_code"> <img id="code_img_closed_121b5376-744c-47af-b6cd-416246d17761" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_121b5376-744c-47af-b6cd-416246d17761" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_121b5376-744c-47af-b6cd-416246d17761" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> Avatar: </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self,name,gender,age,initial_value): self.gender </span>=<span style="color:#000000;"> gender self.name </span>=<span style="color:#000000;"> name self.age </span>=<span style="color:#000000;"> age self.initial_value </span>=<span style="color:#000000;"> initial_value </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> 草丛战斗(self,avatar): self.initial_value </span>-= 200<span style="color:#000000;"> avatar.initial_value </span>-= 200 <span style="color:#0000ff;">def</span><span style="color:#000000;"> 自我修炼(self): self.initial_value </span>+= 100 <span style="color:#0000ff;">return</span><span style="color:#000000;"> self.initial_value </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> 多人游戏(self,avatar): self.initial_value </span>-= 500<span style="color:#000000;"> avatar.initial_value </span>-= 500<span style="color:#000000;"> avatar1 </span>= Avatar(<span style="color:#800000;">'</span><span style="color:#800000;">苍井井</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">女</span><span style="color:#800000;">'</span>,18,1000<span style="color:#000000;">) avatar2 </span>= Avatar(<span style="color:#800000;">'</span><span style="color:#800000;">东尼木木</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">男</span><span style="color:#800000;">'</span>,20,1800<span style="color:#000000;">) avatar3 </span>= Avatar(<span style="color:#800000;">'</span><span style="color:#800000;">波多多</span><span style="color:#800000;">'</span>,<span style="color:#800000;">'</span><span style="color:#800000;">女</span><span style="color:#800000;">'</span>,19,2500<span style="color:#000000;">) </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">{}|{}|{}|{}</span><span style="color:#800000;">"</span><span style="color:#000000;">.format(avatar1.name,avatar1.age,avatar1.gender,avatar1.initial_value)) </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">{}|{}|{}|{}</span><span style="color:#800000;">"</span><span style="color:#000000;">.format(avatar2.name,avatar2.age,avatar2.gender,avatar2.initial_value)) </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">{}|{}|{}|{}</span><span style="color:#800000;">"</span><span style="color:#000000;">.format(avatar3.name,avatar3.age,avatar3.gender,avatar3.initial_value)) </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">草丛战斗</span><span style="color:#800000;">"</span>.center(50,<span style="color:#800000;">"</span><span style="color:#800000;">-</span><span style="color:#800000;">"</span><span style="color:#000000;">)) avatar1.草丛战斗(avatar2) avatar1.草丛战斗(avatar2) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(avatar1.initial_value) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(avatar2.initial_value) </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">自我修炼</span><span style="color:#800000;">"</span>.center(50,<span style="color:#800000;">"</span><span style="color:#800000;">-</span><span style="color:#800000;">"</span><span style="color:#000000;">)) avatar1.自我修炼() avatar1.自我修炼() </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(avatar1.initial_value) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(avatar2.initial_value) </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">多人游戏</span><span style="color:#800000;">"</span>.center(50,<span style="color:#800000;">"</span><span style="color:#800000;">-</span><span style="color:#800000;">"</span><span style="color:#000000;">)) avatar1.多人游戏(avatar2) avatar1.多人游戏(avatar2) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(avatar1.initial_value) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(avatar2.initial_value) </span><span style="color:#800000;">"""</span><span style="color:#800000;"> 苍井井|18|女|1000 东尼木木|20|男|1800 波多多|19|女|2500 -----------------------草丛战斗----------------------- 600 1400 -----------------------自我修炼----------------------- 800 1400 -----------------------多人游戏----------------------- -200 400 </span><span style="color:#800000;">"""</span></pre> </div> <span class="cnblogs_code_collapse">练习二代码</span>  </div> <h3>继承</h3> <p><span style="font-size:12px;">继承在面向对象编程里是一个很重要的特性,子类可以继承着父类的所有功能,这好比现实生活中父亲与儿子,儿子会继承着父亲的基因。继承也有分单继承和多继承,以下是一个单继承的例子。</span></p> <div class="cnblogs_Highlighter"> <pre><code class="language-python">class F2(F1) # F2是儿子,F1是父亲</code></pre> </div> <div class="cnblogs_code"> <img id="code_img_closed_894c06cf-d724-4f4b-9578-40174756f741" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_894c06cf-d724-4f4b-9578-40174756f741" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_894c06cf-d724-4f4b-9578-40174756f741" class="cnblogs_code_hide"> <pre>>>> <span style="color:#0000ff;">class</span><span style="color:#000000;"> S1: ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> F1(self): ... self.F2() ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> F2(self): ... </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">S1的F2</span><span style="color:#800000;">"</span><span style="color:#000000;">) ... </span>>>> <span style="color:#0000ff;">class</span><span style="color:#000000;"> S2(S1): ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> F3(self): ... self.F1() ... </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> F2(self): ... </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">S2的F2</span><span style="color:#800000;">"</span><span style="color:#000000;">) ... </span>>>> s2 =<span style="color:#000000;"> S2() </span>>>><span style="color:#000000;"> s2.F3() S2的F2 </span>>>> s1 =<span style="color:#000000;"> S1() </span>>>><span style="color:#000000;"> s1.F1() S1的F2</span></pre> </div> <span class="cnblogs_code_collapse">单继承例子</span> </div> <p><span style="font-size:12px;">多继承意味着一个子类可以有多于一个的父类,然后父亲们的所有功能,儿子都会继承着,以下是一个多继承的例子。<br></span></p> <div class="cnblogs_Highlighter"> <pre><code class="language-python">class F3(F2,F1) # F3是儿子,F1和F2是父亲</code></pre> </div> <div class="cnblogs_code"> <img id="code_img_closed_64f4b437-7df0-4f11-be7f-6e132331f064" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_64f4b437-7df0-4f11-be7f-6e132331f064" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_64f4b437-7df0-4f11-be7f-6e132331f064" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> C0: </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f2(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">C0</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> C1(C0): </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f1(self): </span><span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> C2: </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f2(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">C2</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> C3(C1,C2): </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f3(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">f3.....</span><span style="color:#800000;">"</span><span style="color:#000000;">) c3 </span>=<span style="color:#000000;"> C3() c3.f2() </span><span style="color:#0000ff;">print</span>(C3.<span style="color:#800080;">__mro__</span><span style="color:#000000;">) </span><span style="color:#800000;">"""</span><span style="color:#800000;"> C0 (<class '__main__.C3'>, <class '__main__.C1'>, <class '__main__.C0'>, <class '__main__.C2'>, <class 'object'>) </span><span style="color:#800000;">"""</span></pre> </div> <span class="cnblogs_code_collapse">多继承例子一</span> </div> <p><span style="font-size:12px;">在这个例子中,C3继承着C1和C2,跟据Python的规定,假设已经创建了一个C3类型的对象,它的运行顺序应该是:</span></p> <ol> <li><span style="font-size:12px;">从对象本身的类里找__init__构造方法</span></li> <li><span style="font-size:12px;">然后这里调用了c3.f2( ) 这个方法,此时,Python会从左往右一直往上跟着父子的继承关系找F2( ) 这个方法。</span></li> <li><span style="font-size:12px;">在下列例子,它会先从C1类里找f2( ),C1有的话它会执行,如果没有的话,因为C1的父类是C0,此时Python会往上到C0类里找f2( )方法而不是往右边的C2类里找 f2( )。</span></li> <li><span style="font-size:12px;">如果所有链条的父类都没有f2( )方法的话,Python此时会在C3的第2个继承父类里找f2( )方法,直到找到为此。<br><a href="http://img.e-com-net.com/image/info8/a61a458ddf7648cf9de2baddf62a5ba5.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a61a458ddf7648cf9de2baddf62a5ba5.jpg" alt="第七章:Python基础のXML操作和面向对象(一)_第2张图片" width="650" height="359" style="border:1px solid black;"></a></span></li> </ol> <p><em><span style="font-size:12px;">这个是多继承例子,然而继承终点不是指向同一对象,但如果继承的时候,最于都会指向同一个父类的话,程序的运行顺序又会是怎么样呢?</span></em></p> <div class="cnblogs_code"> <img id="code_img_closed_aa18cc43-9887-4873-bf73-5baaf6e0b7aa" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_aa18cc43-9887-4873-bf73-5baaf6e0b7aa" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_aa18cc43-9887-4873-bf73-5baaf6e0b7aa" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> C_2: </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f2(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">C-1</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> C_1(C_2): </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f2(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">C-1</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> C0(C_2): </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f1(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">C0</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> C1(C0): </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f1(self): </span><span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> C2: </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f2(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">C2</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> C3(C1,C2): </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> f3(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">f3.....</span><span style="color:#800000;">"</span><span style="color:#000000;">) c3 </span>=<span style="color:#000000;"> C3() c3.f2() </span><span style="color:#0000ff;">print</span>(C3.<span style="color:#800080;">__mro__</span><span style="color:#000000;">) </span><span style="color:#800000;">"""</span><span style="color:#800000;"> C-1 (<class '__main__.C3'>, <class '__main__.C1'>, <class '__main__.C0'>, <class '__main__.C_2'>, <class '__main__.C2'>, <class 'object'>) </span><span style="color:#800000;">"""</span></pre> </div> <span class="cnblogs_code_collapse">多继承例子二</span> </div> <p><span style="font-size:12px;">在这个例子中,C3继承着C1和C2,然后最终都指向C_2类,跟据Python的规定,假设已经创建了一个C3类型的对象,它的运行顺序应该是:</span></p> <ol> <li><span style="font-size:12px;">从对象本身的类里找__init__构造方法</span></li> <li><span style="font-size:12px;">然后这里调用了c3.f2( ) 这个方法,此时,Python会从左往右一直往上跟着父子的继承关系找f2( ) 这个方法,<strong><span style="color:#993300;">必须注意一点!!!!! 如果遇到共同类的话,它会在C3的第2个继承父类里找f2( )方法,而不是我们上一个例子看到的一直随着链条向上找f2( )</span></strong></span></li> <li><span style="font-size:12px;">在下面例子,它会先从C1类里找f2( )方法,C1有的话它就会执行,如果没有的话,因为C1的父类是C0,所以此时的Python会往上到C0类里找f2( )方法而不是直接到C2类里。</span></li> <li><span style="font-size:12px;">但如果C0都没有的话,此时的Python不会再往上到C_2类里找,反而会在C3的第2个继承父类里找f2( )方法,直到找到为此,<span style="color:#993300;"><strong>这是因为两个父类都有指向共同的曾祖父类</strong></span>。<br><a href="http://img.e-com-net.com/image/info8/06b3f35792b749f8b34ad31ce5884a39.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/06b3f35792b749f8b34ad31ce5884a39.jpg" alt="第七章:Python基础のXML操作和面向对象(一)_第3张图片" width="650" height="310" style="border:1px solid black;"></a><br></span></li> </ol> <p><span style="font-size:12px;">再来一个例子,这个继承关系的运行顺序必需很清晰,因为在往后读其他框架源码的时候,很多时候都运用了继承技巧,如果不了解的话就很容易在看源码的时候迷失了。</span><span style="font-size:12px;">下面例子假设S1类继承了S2、S3类,然后S2里有一个 process( )方法,S3里有构造方法,S3继承著S4,里面也有一個构造方法和一個 self.run( ) 方法,self.run( )再调用process( )方法。S4最后也继承著S5,S5里有一个 forever( )方法。</span></p> <div class="cnblogs_code"> <img id="code_img_closed_64cf7fa7-c918-45e8-96aa-7a677eb57bd9" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_64cf7fa7-c918-45e8-96aa-7a677eb57bd9" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_64cf7fa7-c918-45e8-96aa-7a677eb57bd9" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> s5: </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> forever(self): self.run() </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> s4(s5): </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self): self.run() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> run(self): self.process() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> process(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">s4-process</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> s3(s4): </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self): self.name</span>=<span style="color:#800000;">'</span><span style="color:#800000;">s3-name</span><span style="color:#800000;">'</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> s2: </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> process(self): </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">"</span><span style="color:#800000;">s2-process...</span><span style="color:#800000;">"</span><span style="color:#000000;">) </span><span style="color:#0000ff;">class</span><span style="color:#000000;"> s1(s2,s3): </span><span style="color:#0000ff;">pass</span><span style="color:#000000;"> obj </span>=<span style="color:#000000;"> s1() </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(obj.name) obj.forever() </span><span style="color:#0000ff;">print</span>(s1.<span style="color:#800080;">__mro__</span><span style="color:#000000;">) </span><span style="color:#800000;">"""</span><span style="color:#800000;"> s3-name s2-process... (<class '__main__.s1'>, <class '__main__.s2'>, <class '__main__.s3'>, <class '__main__.s4'>, <class '__main__.s5'>, <class 'object'>) </span><span style="color:#800000;">"""</span></pre> </div> <span class="cnblogs_code_collapse">多继承例子三</span> </div> <p><span style="font-size:12px;">假设已经创建了一个C3类型的对象,它的运行顺序应该是:</span></p> <ol> <li><span style="font-size:12px;">从对象本身的类里找__init__构造方法,如果自身类没有__init__方法的话就到它的父类里找,在s2找不到,然后到s3找,找到第一个__init__方法就可以啦</span></li> <li><span style="font-size:12px;">然后执行第2行代码,obj.forever( ),Python 会首先到S2类找这个方法,没有便到s3类找,也没有会一直往链条的父类去找,直到s5类找到了forever( )方法</span></li> <li><span style="font-size:12px;">执行forever( )方法,不过这个方法是调用对象本身的self.run( )方法,此時會再從 s1类里再找一次 run( )方法:s1 --> s2 --> s3 --> s4 --> s5<br></span></li> <li><span style="font-size:12px;">找到在S4类里的run( )的方法,此时,它又调用process( )方法! (你心里会想是不是又要再重新从S1类再找一遍呀!) 没错!你猜对啦<br></span></li> <li><span style="font-size:12px;">先从S1类找 process( )方法,没有的话会到s2类里找!!!!! 终于找到啦!!!</span></li> <li><span style="font-size:12px;">所以运行后的结果是打印 s2-process 而不是 s4-process<br><a href="http://img.e-com-net.com/image/info8/e9630b94f4ed42c1bc337f2cddb371db.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e9630b94f4ed42c1bc337f2cddb371db.jpg" alt="第七章:Python基础のXML操作和面向对象(一)_第4张图片" width="650" height="358" style="border:1px solid black;"></a><br></span></li> </ol> <h3><span style="font-size:12px;">Socket编程的例子<br></span></h3> <p><span style="font-size:12px;">刚刚说过很多时候在读源码时都必需透晰理解类之间的继承关系,这里的一个例子就是关于 socket编程:</span></p> <ul> <li><span style="font-size:12px;">创建一个 ThreadingTCPServer( )的类;</span></li> <li><span style="font-size:12px;">执行对象的 serve_forever( )方法</span></li> </ul> <div class="cnblogs_Highlighter"> <pre><code class="language-python">import socketserver obj = socketserver.ThreadingTCPServer() #命令一 obj.serve_forever() #命令二</code></pre> </div> <p><span style="font-size:12px;">下面是创建一个 ThreadingTCPServer( ) 类的图解和运行顺序:</span></p> <ol> <li><span style="font-size:12px;"><span style="font-size:12px;">首先是创建了一个 socketserver.ThreadingTCPServer 的对象叫 obj,紧接着是找他的 __init__( )方法,下面是它的类,这里是一个空值。<br><a href="http://img.e-com-net.com/image/info8/57d663b5fce24ab2b69895335701c741.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/57d663b5fce24ab2b69895335701c741.jpg" alt="第七章:Python基础のXML操作和面向对象(一)_第5张图片" width="650" height="192" style="border:1px solid black;"></a><br></span></span> <div class="cnblogs_Highlighter"> <pre><code class="language-python">class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass</code></pre> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">ThreadingTCPServer 继承者两个类,一个是 ThreadingMixIn,另外一个是 TCPServer,當在自己本身找不到 __init__( )方法,就會到它的父類去找 (ThreadingMixIn 或者 TCPServer),这里最终在 TCPServer 这个类里找到了 __init__( ) 方法,到這里命令一就完整啦<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_0f0d7e53-227a-4d2e-8655-5d85fdf49333" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_0f0d7e53-227a-4d2e-8655-5d85fdf49333" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_0f0d7e53-227a-4d2e-8655-5d85fdf49333" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span>(self, server_address, RequestHandlerClass, bind_and_activate=<span style="color:#000000;">True): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Constructor. May be extended, do not override.</span><span style="color:#800000;">"""</span><span style="color:#000000;"> BaseServer.</span><span style="color:#800080;">__init__</span><span style="color:#000000;">(self, server_address, RequestHandlerClass) self.socket </span>=<span style="color:#000000;"> socket.socket(self.address_family, self.socket_type) </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> bind_and_activate: </span><span style="color:#0000ff;">try</span><span style="color:#000000;">: self.server_bind() self.server_activate() </span><span style="color:#0000ff;">except</span><span style="color:#000000;">: self.server_close() </span><span style="color:#0000ff;">raise</span></pre> </div> <span class="cnblogs_code_collapse">TCPServer里的__init__( )方法</span> </div> </li> <li><span style="font-size:12px;"><span style="font-size:12px;">现在是执行命令二:执行 obj.serve_forever( )方法,还是会先从 ThreadingTCPServer 类里找 serve_forever( )方法,但它并不存在,然后开始到它的父类,即 ThreadingMixIn 类里找,也会找不到发现 serve_forever( )方法。<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_24aa92d1-8c58-4758-a1ab-dcbe0c8004f3" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_24aa92d1-8c58-4758-a1ab-dcbe0c8004f3" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_24aa92d1-8c58-4758-a1ab-dcbe0c8004f3" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> ThreadingMixIn: </span><span style="color:#800000;">"""</span><span style="color:#800000;">Mix-in class to handle each request in a new thread.</span><span style="color:#800000;">"""</span> <span style="color:#008000;">#</span><span style="color:#008000;"> Decides how threads will act upon termination of the</span> <span style="color:#008000;">#</span><span style="color:#008000;"> main process</span> daemon_threads =<span style="color:#000000;"> False </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> process_request_thread(self, request, client_address): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Same as in BaseServer but as a thread. In addition, exception handling is done here. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">try</span><span style="color:#000000;">: self.finish_request(request, client_address) self.shutdown_request(request) </span><span style="color:#0000ff;">except</span><span style="color:#000000;">: self.handle_error(request, client_address) self.shutdown_request(request) </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> process_request(self, request, client_address): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Start a new thread to process the request.</span><span style="color:#800000;">"""</span><span style="color:#000000;"> t </span>= threading.Thread(target =<span style="color:#000000;"> self.process_request_thread, args </span>=<span style="color:#000000;"> (request, client_address)) t.daemon </span>=<span style="color:#000000;"> self.daemon_threads t.start()</span></pre> </div> <span class="cnblogs_code_collapse">class ThreadingMixIn 源码</span> </div> </li> <li><span style="font-size:12px;">此时会到它的第2个父类里找:TCPSever 类</span><br> <div class="cnblogs_code"> <img id="code_img_closed_3945c26d-d2c1-4d2a-ad7a-4801a6d5541d" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_3945c26d-d2c1-4d2a-ad7a-4801a6d5541d" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_3945c26d-d2c1-4d2a-ad7a-4801a6d5541d" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> TCPServer(BaseServer): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Base class for various socket-based server classes. Defaults to synchronous IP stream (i.e., TCP). Methods for the caller: - __init__(server_address, RequestHandlerClass, bind_and_activate=True) - serve_forever(poll_interval=0.5) - shutdown() - handle_request() # if you don't use serve_forever() - fileno() -> int # for selector Methods that may be overridden: - server_bind() - server_activate() - get_request() -> request, client_address - handle_timeout() - verify_request(request, client_address) - process_request(request, client_address) - shutdown_request(request) - close_request(request) - handle_error() Methods for derived classes: - finish_request(request, client_address) Class variables that may be overridden by derived classes or instances: - timeout - address_family - socket_type - request_queue_size (only for stream sockets) - allow_reuse_address Instance variables: - server_address - RequestHandlerClass - socket </span><span style="color:#800000;">"""</span><span style="color:#000000;"> address_family </span>=<span style="color:#000000;"> socket.AF_INET socket_type </span>=<span style="color:#000000;"> socket.SOCK_STREAM request_queue_size </span>= 5<span style="color:#000000;"> allow_reuse_address </span>=<span style="color:#000000;"> False </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span>(self, server_address, RequestHandlerClass, bind_and_activate=<span style="color:#000000;">True): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Constructor. May be extended, do not override.</span><span style="color:#800000;">"""</span><span style="color:#000000;"> BaseServer.</span><span style="color:#800080;">__init__</span><span style="color:#000000;">(self, server_address, RequestHandlerClass) self.socket </span>=<span style="color:#000000;"> socket.socket(self.address_family, self.socket_type) </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> bind_and_activate: </span><span style="color:#0000ff;">try</span><span style="color:#000000;">: self.server_bind() self.server_activate() </span><span style="color:#0000ff;">except</span><span style="color:#000000;">: self.server_close() </span><span style="color:#0000ff;">raise</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> server_bind(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called by constructor to bind the socket. May be overridden. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">if</span><span style="color:#000000;"> self.allow_reuse_address: self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, </span>1<span style="color:#000000;">) self.socket.bind(self.server_address) self.server_address </span>=<span style="color:#000000;"> self.socket.getsockname() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> server_activate(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called by constructor to activate the server. May be overridden. </span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.socket.listen(self.request_queue_size) </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> server_close(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called to clean-up the server. May be overridden. </span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.socket.close() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> fileno(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Return socket file number. Interface required by selector. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">return</span><span style="color:#000000;"> self.socket.fileno() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> get_request(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Get the request and client address from the socket. May be overridden. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">return</span><span style="color:#000000;"> self.socket.accept() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> shutdown_request(self, request): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called to shutdown and close an individual request.</span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">try</span><span style="color:#000000;">: </span><span style="color:#008000;">#</span><span style="color:#008000;">explicitly shutdown. socket.close() merely releases</span> <span style="color:#008000;">#</span><span style="color:#008000;">the socket and waits for GC to perform the actual close.</span> <span style="color:#000000;"> request.shutdown(socket.SHUT_WR) </span><span style="color:#0000ff;">except</span><span style="color:#000000;"> OSError: </span><span style="color:#0000ff;">pass</span> <span style="color:#008000;">#</span><span style="color:#008000;">some platforms may raise ENOTCONN here</span> <span style="color:#000000;"> self.close_request(request) </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> close_request(self, request): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called to clean up an individual request.</span><span style="color:#800000;">"""</span><span style="color:#000000;"> request.close()</span></pre> </div> <span class="cnblogs_code_collapse">class TCPServer 源码</span> </div> </li> <li><span style="font-size:12px;">也是找不到,TCPServer 也有一个父类叫 BaseServer</span><br> <div class="cnblogs_code"> <img id="code_img_closed_3ea4ffca-1df5-4342-92cb-c824c343a636" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_3ea4ffca-1df5-4342-92cb-c824c343a636" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_3ea4ffca-1df5-4342-92cb-c824c343a636" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> BaseServer: </span><span style="color:#800000;">"""</span><span style="color:#800000;">Base class for server classes. Methods for the caller: - __init__(server_address, RequestHandlerClass) - serve_forever(poll_interval=0.5) - shutdown() - handle_request() # if you do not use serve_forever() - fileno() -> int # for selector Methods that may be overridden: - server_bind() - server_activate() - get_request() -> request, client_address - handle_timeout() - verify_request(request, client_address) - server_close() - process_request(request, client_address) - shutdown_request(request) - close_request(request) - service_actions() - handle_error() Methods for derived classes: - finish_request(request, client_address) Class variables that may be overridden by derived classes or instances: - timeout - address_family - socket_type - allow_reuse_address Instance variables: - RequestHandlerClass - socket </span><span style="color:#800000;">"""</span><span style="color:#000000;"> timeout </span>=<span style="color:#000000;"> None </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self, server_address, RequestHandlerClass): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Constructor. May be extended, do not override.</span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.server_address </span>=<span style="color:#000000;"> server_address self.RequestHandlerClass </span>=<span style="color:#000000;"> RequestHandlerClass self.</span><span style="color:#800080;">__is_shut_down</span> =<span style="color:#000000;"> threading.Event() self.</span><span style="color:#800080;">__shutdown_request</span> =<span style="color:#000000;"> False </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> server_activate(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called by constructor to activate the server. May be overridden. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span> serve_forever(self, poll_interval=0.5<span style="color:#000000;">): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Handle one request at a time until shutdown. Polls for shutdown every poll_interval seconds. Ignores self.timeout. If you need to do periodic tasks, do them in another thread. </span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.</span><span style="color:#800080;">__is_shut_down</span><span style="color:#000000;">.clear() </span><span style="color:#0000ff;">try</span><span style="color:#000000;">: </span><span style="color:#008000;">#</span><span style="color:#008000;"> XXX: Consider using another file descriptor or connecting to the</span> <span style="color:#008000;">#</span><span style="color:#008000;"> socket to wake this up instead of polling. Polling reduces our</span> <span style="color:#008000;">#</span><span style="color:#008000;"> responsiveness to a shutdown request and wastes cpu at all other</span> <span style="color:#008000;">#</span><span style="color:#008000;"> times.</span> <span style="color:#000000;"> with _ServerSelector() as selector: selector.register(self, selectors.EVENT_READ) </span><span style="color:#0000ff;">while</span> <span style="color:#0000ff;">not</span> self.<span style="color:#800080;">__shutdown_request</span><span style="color:#000000;">: ready </span>=<span style="color:#000000;"> selector.select(poll_interval) </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> ready: self._handle_request_noblock() self.service_actions() </span><span style="color:#0000ff;">finally</span><span style="color:#000000;">: self.</span><span style="color:#800080;">__shutdown_request</span> =<span style="color:#000000;"> False self.</span><span style="color:#800080;">__is_shut_down</span><span style="color:#000000;">.set() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> shutdown(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Stops the serve_forever loop. Blocks until the loop has finished. This must be called while serve_forever() is running in another thread, or it will deadlock. </span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.</span><span style="color:#800080;">__shutdown_request</span> =<span style="color:#000000;"> True self.</span><span style="color:#800080;">__is_shut_down</span><span style="color:#000000;">.wait() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> service_actions(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called by the serve_forever() loop. May be overridden by a subclass / Mixin to implement any code that needs to be run during the loop. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">pass</span> <span style="color:#008000;">#</span><span style="color:#008000;"> The distinction between handling, getting, processing and finishing a</span> <span style="color:#008000;">#</span><span style="color:#008000;"> request is fairly arbitrary. Remember:</span> <span style="color:#008000;"># </span> <span style="color:#008000;">#</span><span style="color:#008000;"> - handle_request() is the top-level call. It calls selector.select(),</span> <span style="color:#008000;">#</span><span style="color:#008000;"> get_request(), verify_request() and process_request()</span> <span style="color:#008000;">#</span><span style="color:#008000;"> - get_request() is different for stream or datagram sockets</span> <span style="color:#008000;">#</span><span style="color:#008000;"> - process_request() is the place that may fork a new process or create a</span> <span style="color:#008000;">#</span><span style="color:#008000;"> new thread to finish the request</span> <span style="color:#008000;">#</span><span style="color:#008000;"> - finish_request() instantiates the request handler class; this</span> <span style="color:#008000;">#</span><span style="color:#008000;"> constructor will handle the request all by itself</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> handle_request(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Handle one request, possibly blocking. Respects self.timeout. </span><span style="color:#800000;">"""</span> <span style="color:#008000;">#</span><span style="color:#008000;"> Support people who used socket.settimeout() to escape</span> <span style="color:#008000;">#</span><span style="color:#008000;"> handle_request before self.timeout was available.</span> timeout =<span style="color:#000000;"> self.socket.gettimeout() </span><span style="color:#0000ff;">if</span> timeout <span style="color:#0000ff;">is</span><span style="color:#000000;"> None: timeout </span>=<span style="color:#000000;"> self.timeout </span><span style="color:#0000ff;">elif</span> self.timeout <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None: timeout </span>=<span style="color:#000000;"> min(timeout, self.timeout) </span><span style="color:#0000ff;">if</span> timeout <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None: deadline </span>= time() +<span style="color:#000000;"> timeout </span><span style="color:#008000;">#</span><span style="color:#008000;"> Wait until a request arrives or the timeout expires - the loop is</span> <span style="color:#008000;">#</span><span style="color:#008000;"> necessary to accommodate early wakeups due to EINTR.</span> <span style="color:#000000;"> with _ServerSelector() as selector: selector.register(self, selectors.EVENT_READ) </span><span style="color:#0000ff;">while</span><span style="color:#000000;"> True: ready </span>=<span style="color:#000000;"> selector.select(timeout) </span><span style="color:#0000ff;">if</span><span style="color:#000000;"> ready: </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> self._handle_request_noblock() </span><span style="color:#0000ff;">else</span><span style="color:#000000;">: </span><span style="color:#0000ff;">if</span> timeout <span style="color:#0000ff;">is</span> <span style="color:#0000ff;">not</span><span style="color:#000000;"> None: timeout </span>= deadline -<span style="color:#000000;"> time() </span><span style="color:#0000ff;">if</span> timeout <<span style="color:#000000;"> 0: </span><span style="color:#0000ff;">return</span><span style="color:#000000;"> self.handle_timeout() </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> _handle_request_noblock(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Handle one request, without blocking. I assume that selector.select() has returned that the socket is readable before this function was called, so there should be no risk of blocking in get_request(). </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">try</span><span style="color:#000000;">: request, client_address </span>=<span style="color:#000000;"> self.get_request() </span><span style="color:#0000ff;">except</span><span style="color:#000000;"> OSError: </span><span style="color:#0000ff;">return</span> <span style="color:#0000ff;">if</span><span style="color:#000000;"> self.verify_request(request, client_address): </span><span style="color:#0000ff;">try</span><span style="color:#000000;">: self.process_request(request, client_address) </span><span style="color:#0000ff;">except</span><span style="color:#000000;">: self.handle_error(request, client_address) self.shutdown_request(request) </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> handle_timeout(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called if no new request arrives within self.timeout. Overridden by ForkingMixIn. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> verify_request(self, request, client_address): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Verify the request. May be overridden. Return True if we should proceed with this request. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">return</span><span style="color:#000000;"> True </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> process_request(self, request, client_address): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Call finish_request. Overridden by ForkingMixIn and ThreadingMixIn. </span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.finish_request(request, client_address) self.shutdown_request(request) </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> server_close(self): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called to clean-up the server. May be overridden. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> finish_request(self, request, client_address): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Finish one request by instantiating RequestHandlerClass.</span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.RequestHandlerClass(request, client_address, self) </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> shutdown_request(self, request): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called to shutdown and close an individual request.</span><span style="color:#800000;">"""</span><span style="color:#000000;"> self.close_request(request) </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> close_request(self, request): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Called to clean up an individual request.</span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">pass</span> <span style="color:#0000ff;">def</span><span style="color:#000000;"> handle_error(self, request, client_address): </span><span style="color:#800000;">"""</span><span style="color:#800000;">Handle an error gracefully. May be overridden. The default is to print a traceback and continue. </span><span style="color:#800000;">"""</span> <span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">-</span><span style="color:#800000;">'</span>*40<span style="color:#000000;">) </span><span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">Exception happened during processing of request from</span><span style="color:#800000;">'</span>, end=<span style="color:#800000;">'</span> <span style="color:#800000;">'</span><span style="color:#000000;">) </span><span style="color:#0000ff;">print</span><span style="color:#000000;">(client_address) </span><span style="color:#0000ff;">import</span><span style="color:#000000;"> traceback traceback.print_exc() </span><span style="color:#008000;">#</span><span style="color:#008000;"> XXX But this goes to stderr!</span> <span style="color:#0000ff;">print</span>(<span style="color:#800000;">'</span><span style="color:#800000;">-</span><span style="color:#800000;">'</span>*40)</pre> </div> <span class="cnblogs_code_collapse">class BaseServer 源码</span> </div> </li> <li><span style="font-size:12px;"> 在 BaseServer 里找到了 serve_forever( )方法,这个方法又调用了一个叫 self._handle request nonblock(),它又会再调用 self.process_request(request, client_address)。最於我們可以在 ThreadingMixIn 類里找到了 process_request(self, request, client_address) 的方法。 </span></li> </ol> <p><strong><span style="font-size:12px;">Socket编程例子的继承关系图</span></strong></p> <p><a href="http://img.e-com-net.com/image/info8/042f7b3ec58544e29587e083249eb487.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/042f7b3ec58544e29587e083249eb487.jpg" alt="第七章:Python基础のXML操作和面向对象(一)_第6张图片" width="650" height="572" style="border:1px solid black;"></a> </p> <p> </p> <h2>本周作业</h2> <p><span style="font-size:12px;">运用面向对象来写一个选课系统</span></p> <p><span style="font-size:12px;">背景:这是一个 pay-as-you-go 的网上选课系统,学生可以在选该学期想学习的课程,每个课程都有它相对应的课时,学费和难易度,每个老师都有他自己的姓名,爱好,姓别,专长,老师的功能是负责<strong>授课;</strong></span><span style="font-size:12px;">每个学生也有他的姓名,爱好,姓别和技能评分,学生的功能是负责<strong>上课</strong>; 当学生们选完课之后呢,因为每个课程都有学费,所以呢,当老师完整了他任务的时候,可以有收入,相反学生便有同等的支出,程序运行之后可以打印老师X 在该学期的收入和学生X 在该学期的支出。</span></p> <p><span style="font-size:12px;">管理员:</span><br><span style="font-size:12px;">创建老师:姓名、性别、年龄、资产</span><br><span style="font-size:12px;">创建课程:课程名称、上课时间、课时费、关联老师</span><br><span style="font-size:12px;">学生:用户名、密码、性别、年龄、选课列表[]、上课记录{课程1:【di,a,】}</span></p> <ol> <li><span style="font-size:12px;">管理员设置课程信息和老师信息</span></li> <li><span style="font-size:12px;">老师上课获得课时费</span></li> <li><span style="font-size:12px;">学生上课,学到“上课内容”</span></li> <li><span style="font-size:12px;">学生可自选课程</span></li> <li><span style="font-size:12px;">学生可查看已选课程和上课记录</span></li> <li><span style="font-size:12px;">学生可评价老师,差评老师要扣款</span></li> <li><span style="font-size:12px;">使用pickle</span></li> </ol> <p><span style="font-size:12px;"><em>pickle 模块将对象转化为文件保存在磁盘上,在需要的时候再读取并还原,pickle 介绍和操作可以参考这里</em></span></p> <p> </p> <p><strong><span style="font-size:12px;">思路</span></strong></p> <p><span style="font-size:12px;">管理员</span></p> <ul> <li><span style="font-size:12px;"><span style="font-size:12px;">创建老师 (名字、爱好、资产)<br></span></span> <div class="cnblogs_code"> <img id="code_img_closed_48f6df91-2b22-4b2a-92c3-3d73b65d282f" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_48f6df91-2b22-4b2a-92c3-3d73b65d282f" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_48f6df91-2b22-4b2a-92c3-3d73b65d282f" class="cnblogs_code_hide"> <pre><span style="color:#0000ff;">class</span><span style="color:#000000;"> Teacher: </span><span style="color:#0000ff;">def</span> <span style="color:#800080;">__init__</span><span style="color:#000000;">(self,favor,name,age): self.favor </span>=<span style="color:#000000;"> favour self.name </span>=<span style="color:#000000;"> name self.age </span>=<span style="color:#000000;"> age self.asset </span>=<span style="color:#000000;"> 0 </span><span style="color:#0000ff;">def</span><span style="color:#000000;"> teaching_event(self): self.asset </span>= asset - 1 <span style="color:#0000ff;">def</span><span style="color:#000000;"> gain(self,value): self.asset </span>+=<span style="color:#000000;"> value obj1 </span>= Teacher() <span style="color:#008000;">#</span><span style="color:#008000;"> Teacher类型</span> obj2 = Teacher() <span style="color:#008000;">#</span><span style="color:#008000;"> Teacher类型</span> obj3 = Teacher() <span style="color:#008000;">#</span><span style="color:#008000;"> Teacher类型</span> obj4 = Teacher() <span style="color:#008000;">#</span><span style="color:#008000;"> Teacher类型</span> <span style="color:#000000;"> lst </span>=<span style="color:#000000;"> [obj1,obj2,obj3,obj4] pickle.dump(lst)</span></pre> </div> <span class="cnblogs_code_collapse">class Teacher</span> </div> </li> <li><span style="font-size:12px;">创建</span><span style="font-size:12px;">课程</span></li> <li><span style="font-size:12px;">课時类</span> <ul> <li><span style="font-size:12px;">课時名</span></li> <li><span style="font-size:12px;">课时费</span></li> <li><span style="font-size:12px;">负责老师 = li[0]</span></li> </ul></li> <li><span style="font-size:12px;">功能</span> <ul> <li><span style="font-size:12px;">上課</span> <ul> <li><span style="font-size:12px;">返回给学生学习的内容</span></li> <li><span style="font-size:12px;"><span style="font-size:12px;">负责老师掙錢li[0].gain(</span></span><span style="font-size:12px;">课时费)</span></li> </ul></li> <li><span style="font-size:12px;">课程对象</span></li> </ul></li> </ul> <p><span style="font-size:12px;">学生</span></p> <ul> <li><span style="font-size:12px;">類</span></li> <li><span style="font-size:12px;">功能: 選課</span></li> <li><span style="font-size:12px;">上課:生物課 </span></li> <li><span style="font-size:12px;">课程对象.对象</span></li> </ul> <p><span style="font-size:12px;">[知识点:pickle 模块、类的封装]</span></p> <p> </p> <div class="cnblogs_code"> <img id="code_img_closed_5106ca8b-b9e5-4991-8c7f-8562b6cd4831" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> <img id="code_img_opened_5106ca8b-b9e5-4991-8c7f-8562b6cd4831" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_5106ca8b-b9e5-4991-8c7f-8562b6cd4831" class="cnblogs_code_hide"> <pre>Username >><span style="color:#000000;"> janice Password </span>>><span style="color:#000000;"> janice123 Login Successfully. Welcome to the IT Academy HI JANICE [Student], PLEASE SELECT ONE ACTION [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 4 -------------YOUR COURSE INFORMATION--------------<span style="color:#000000;"> Class Name: English Date: Sat Total hours: </span>10<span style="color:#000000;"> Price: </span>1000 -------------YOUR ACCOUNT INFORMATION-------------<span style="color:#000000;"> Total Course taken: </span>1<span style="color:#000000;"> Name: Janice Gender: Female Balance: </span>1000<span style="color:#000000;"> [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 3 --------------ALL COURSE INFORMATION--------------<span style="color:#000000;"> Class Name: Programming Date: Fri Total hours: </span>8<span style="color:#000000;"> Price: </span>800<span style="color:#000000;"> Class Name: English Date: Sat Total hours: </span>10<span style="color:#000000;"> Price: </span>1000<span style="color:#000000;"> Class Name: Sales </span><span style="color:#0000ff;">and</span><span style="color:#000000;"> Marketing Date: Sat Total hours: </span>15<span style="color:#000000;"> Price: </span>1500<span style="color:#000000;"> Class Name: Arts </span><span style="color:#0000ff;">and</span><span style="color:#000000;"> Design Date: Sat Total hours: </span>20<span style="color:#000000;"> Price: </span>2000<span style="color:#000000;"> [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 1 ------------------Pick a course-------------------<span style="color:#000000;"> c1. Programming c4. English c2. Sales </span><span style="color:#0000ff;">and</span><span style="color:#000000;"> Marketing c3. Arts </span><span style="color:#0000ff;">and</span><span style="color:#000000;"> Design Which </span><span style="color:#0000ff;">class</span> do you want to <span style="color:#0000ff;">try</span><span style="color:#000000;">? Please pick one </span>>><span style="color:#000000;"> c1 You have selected c1 [c</span>=confirmed][q=<span style="color:#000000;">quit] Confirmed to take the course? </span>>><span style="color:#000000;"> c Programming A new course added to your account [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 4 -------------YOUR COURSE INFORMATION--------------<span style="color:#000000;"> Class Name: English Date: Sat Total hours: </span>10<span style="color:#000000;"> Price: </span>1000<span style="color:#000000;"> Class Name: Programming Date: Fri Total hours: </span>8<span style="color:#000000;"> Price: </span>800 -------------YOUR ACCOUNT INFORMATION-------------<span style="color:#000000;"> Total Course taken: </span>2<span style="color:#000000;"> Name: Janice Gender: Female Balance: </span>1800<span style="color:#000000;"> [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 2<span style="color:#000000;"> Attendng a </span><span style="color:#0000ff;">class</span><span style="color:#000000;">..... [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 2<span style="color:#000000;"> Attendng a </span><span style="color:#0000ff;">class</span><span style="color:#000000;">..... [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 2<span style="color:#000000;"> Attendng a </span><span style="color:#0000ff;">class</span><span style="color:#000000;">..... [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> 4 -------------YOUR COURSE INFORMATION--------------<span style="color:#000000;"> Class Name: English Date: Sat Total hours: </span>10<span style="color:#000000;"> Price: </span>1000<span style="color:#000000;"> Class Name: Programming Date: Fri Total hours: </span>8<span style="color:#000000;"> Price: </span>800 -------------YOUR ACCOUNT INFORMATION-------------<span style="color:#000000;"> Total Course taken: </span>2<span style="color:#000000;"> Name: Janice Gender: Female Balance: </span>1500<span style="color:#000000;"> [q</span>=quit] 1.选课; 2.上课; 3.查看课程信息; 4<span style="color:#000000;">.查看个人课程信息 </span>>> </pre> </div> <span class="cnblogs_code_collapse">程序运行结果</span> </div> <p> </p> <p> </p> <h2>參考資料</h2> <p><span style="font-size:12px;">银角大王:Python开发【第六篇】:模块</span></p> <p><span style="font-size:12px;">银角大王:Python 面向对象(初级篇)</span></p> <p><span style="font-size:12px;">Subprocess </span></p> <p> </p> </div> <p>转载于:https://www.cnblogs.com/jcchoiling/p/5840875.html</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1700750537512792064"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(第七章:Python基础のXML操作和面向对象(一))</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950233451282100224.htm" title="python 读excel每行替换_Python脚本操作Excel实现批量替换功能" target="_blank">python 读excel每行替换_Python脚本操作Excel实现批量替换功能</a> <span class="text-muted">weixin_39646695</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%AF%BBexcel%E6%AF%8F%E8%A1%8C%E6%9B%BF%E6%8D%A2/1.htm">读excel每行替换</a> <div>Python脚本操作Excel实现批量替换功能大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换。使用的工具Openpyxl,一个处理excel的python库,处理excel,其实针对的就是WorkBook,Sheet,Cell这三个最根本的元素~明确需求原始excel如下我们的目标是把下面excel工作表的sheet1表页A列的内容“替换我吧”批量替换为B列的“我用来替换的</div> </li> <li><a href="/article/1950233199242178560.htm" title="x86-64汇编语言训练程序与实战" target="_blank">x86-64汇编语言训练程序与实战</a> <span class="text-muted">十除以十等于一</span> <div>本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层</div> </li> <li><a href="/article/1950233167633903616.htm" title="男士护肤品哪个牌子好?十大男士护肤品排行榜" target="_blank">男士护肤品哪个牌子好?十大男士护肤品排行榜</a> <span class="text-muted">高省APP珊珊</span> <div>很多男生意识到护肤的必要性,开始着手护肤,但不知道该选哪个男士护肤品品牌使用好。目前市面上很多男士护肤品品牌,可谓琳琅满目,让人眼花缭乱。男士挑选护肤品时,根据自己皮肤需求去正规渠道挑选合适的知名护肤品比较放心靠谱。高省APP,是2021年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,也期待你的加入</div> </li> <li><a href="/article/1950233072825856000.htm" title="三菱PLC全套学习资料及应用手册" target="_blank">三菱PLC全套学习资料及应用手册</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化</div> </li> <li><a href="/article/1950233040592629760.htm" title="2022-10-20" target="_blank">2022-10-20</a> <span class="text-muted">体力劳动者</span> <div>不因感觉稍纵即逝就不加记录。在女儿睡觉后我记下今天的小故事。接手新班级后,今天是第二次收到家长的感谢信(微信)。是我表扬次数最多的两位学生家长致来的感谢,他们明显感受到孩子自信、阳光了不少,写作业由被动变为了主动,家庭氛围也由鸡飞狗跳变成了其乐融融。在被顽皮的学生气得头晕之后,我感到了久违的价值感,责任感甚至使命感,我回复家长这样一句话:我们也需要家长的反馈好让我们的教育工作更有劲头。我也认识到,</div> </li> <li><a href="/article/1950232912192401408.htm" title="程翔授《评价一篇记叙文》" target="_blank">程翔授《评价一篇记叙文》</a> <span class="text-muted">行吟斯基</span> <div>桂林十一中高一2中学生自读程老师学生文章板书课题师巡看。看完举手。问:它是记叙文。不商量。独立打分。学生评价打分。师:高低都正常,不受干扰。师巡,略评。打完举手。调查:分层次举手——高分先举手。最低分。最高95分。最低45分。女:差距太大!师:同一篇,相差55分。若是你的文章,愿落谁手?男:身临其境感觉。师:你有此经历?没也没关系。女:不优美……,结尾无升华……无感悟……师:辞藻不美?(师追问)男</div> </li> <li><a href="/article/1950232910862807040.htm" title="《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单" target="_blank">《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单</a> <span class="text-muted">windy天意晚晴</span> <div>《玉骨遥》里,朱颜就是时影的命劫之人。重明与时影早就知道,他们一直瞒着大司命,如今大司命也知道了真相。可是大司命却没有杀朱颜,而是给朱颜下了诛心咒,还说时影的命劫已经破了,真的如此吗?1、计划总是赶不上变化的大司命从目前剧情来说,大司命还不如时影,他信心十足的事情总会有纰漏。他不让时影见命劫之女,结果时影还是遇上了。他想让时影走火入魔,一心复仇,结果时影在朱颜的劝说下放下了仇恨。大司命让时影开山收</div> </li> <li><a href="/article/1950232820773351424.htm" title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div> </li> <li><a href="/article/1950232782412247040.htm" title="日更006 终极训练营day3" target="_blank">日更006 终极训练营day3</a> <span class="text-muted">懒cici</span> <div>人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向</div> </li> <li><a href="/article/1950232783670538240.htm" title="自律打卡第四天:比昨天进步一点点" target="_blank">自律打卡第四天:比昨天进步一点点</a> <span class="text-muted">花儿的念想</span> <div>今天新闻我们县城又确诊了一例,截止目前已经确诊的三例了,打开,看了一篇简友写的武汉的真实情况,有病住不了院,还没等到床位已经去世的消息,心里更加的难受,武汉尚且这样,如果是我们这没有高速没有火车的十八线的小县城发生这种情况,那情况将是更加的不堪设想,不敢想,唯有祈求灾难早点快去,平安才是最大的福气。突然觉得我的自律打卡,比昨天进步一点点。更希望疫情战争每一天都要比昨天好一点,希望一觉醒来听到的是好</div> </li> <li><a href="/article/1950232781174927360.htm" title="15个小技巧,让我的Windows电脑更好用了!" target="_blank">15个小技巧,让我的Windows电脑更好用了!</a> <span class="text-muted">曹元_</span> <div>01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们</div> </li> <li><a href="/article/1950232316974526464.htm" title="(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析" target="_blank">(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析</a> <span class="text-muted"></span> <div>数据如何从子公司流转到合并报表的全过程,即数据采集→合并引擎→报表输出,特别是HANA内存计算如何优化传统ETL瓶颈。SAPGroupReporting(GR)核心模块功能及数据流向的架构解析,涵盖核心组件、数据处理流程和关键集成点,适用于S/4HANA1809+版本:一、核心功能模块概览模块功能关键事务码/FioriApp数据采集(DataCollection)整合子公司财务数据(SAP/非SA</div> </li> <li><a href="/article/1950232316408295424.htm" title="9、汇编语言编程入门:从环境搭建到简单程序实现" target="_blank">9、汇编语言编程入门:从环境搭建到简单程序实现</a> <span class="text-muted">神经网络酱</span> <a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/1.htm">汇编语言</a><a class="tag" taget="_blank" href="/search/MEPIS/1.htm">MEPIS</a><a class="tag" taget="_blank" href="/search/GNU%E5%B7%A5%E5%85%B7%E9%93%BE/1.htm">GNU工具链</a> <div>汇编语言编程入门:从环境搭建到简单程序实现1.数据存储介质问题解决在处理数据存储时,若要使用MEPIS系统,需确保有其可访问的存储介质。目前,MEPIS无法向采用NTFS格式(常用于Windows2000和XP工作站)的硬盘写入数据。不过,若硬盘采用FAT32格式,MEPIS就能进行写入操作。此外,MEPIS还能将文件写入软盘和大多数USB闪存驱动器。若工作站连接到局域网,还可通过FTP协议或挂载</div> </li> <li><a href="/article/1950232275262173184.htm" title="月光下的罪恶(5)" target="_blank">月光下的罪恶(5)</a> <span class="text-muted">允歌玖沐</span> <div>5.被孤立顾纨是转校过来的,进入学校后,回头率很高“诶诶诶,你看那女生,哪个系的?”“不知道没见过。”“看那样,一看就是个胆小的货。”顾纨当做没听到,更狠的话她都听过,更何况女生们耍心眼?“他爸爸是做黑生意的,估计女儿也不是什么好的,你以后离他一家子远点。”她走向自己要上课的教室,一进门,所有人的目光看向她,顾纨若无其事的走进教室,开始上课。下课,一群人站起来,但是很显然,她周围的一圈人都不愿意和</div> </li> <li><a href="/article/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950231640819167232.htm" title="贝多芬诞辰250周年纪念" target="_blank">贝多芬诞辰250周年纪念</a> <span class="text-muted">万千星河赴远方</span> <div>就算不是古典音乐爱好者,你也一定听说过贝多芬。作为古典音乐史上最伟大的音乐家之一,他不仅是古典主义风格的集大成者,同时也是浪漫主义风格的开创者。贝多芬肖像画(1813年)贝多芬的一生共创作了9部交响曲、36首钢琴奏鸣曲、10部小提琴奏鸣曲、16首弦乐四重奏、1部歌剧及2部弥撒曲等等。数量虽然不及前辈海顿、莫扎特多,但他几乎改造了当时所有的音乐表达形式,赋予了它们全新的价值,对后世音乐的发展产生了极</div> </li> <li><a href="/article/1950231508648259584.htm" title="三件事—小白猫·雨天·八段锦" target="_blank">三件事—小白猫·雨天·八段锦</a> <span class="text-muted">咸鱼月亮</span> <div>1.最近楼下出现一只非常漂亮的粘人小白猫,看着不像是流浪猫,非常亲人。眼睛比蓝球的还大,而且是绿色的,很漂亮。第一次遇到它,它就跟我到电梯口,如果我稍微招招手,肯定就跟我进电梯了。后来我喂过它几次,好可惜不能养它,一只蓝球就是我的极限了。2.下雨天就心烦,好奇怪。明明以前我超爱看窗外的雨和听雨声,看来近来的心情不够宁静了。3.最近在练八段锦,从第一次就爱上了这个运动,很轻松缓慢,但是却出汗。感觉可</div> </li> <li><a href="/article/1950231509906550784.htm" title="25-1-2019" target="_blank">25-1-2019</a> <span class="text-muted">树藤与海岛呢</span> <div>hello八月来报道了今天看到了一篇文章就只想记下那两句话:良田千顷不过一日三餐广夏万间只睡卧榻三尺大概的意思就是要珍惜当下不要等来不及的时候才珍惜分享今天的两餐最近没有时间运动呢下个月补回好了说完了哈哈goodnight图片发自App图片发自App</div> </li> <li><a href="/article/1950231381485350912.htm" title="《极简思维》第三部分" target="_blank">《极简思维》第三部分</a> <span class="text-muted">小洋苏兮</span> <div>整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别</div> </li> <li><a href="/article/1950231308781285376.htm" title="力扣热题100-------54. 螺旋矩阵" target="_blank">力扣热题100-------54. 螺旋矩阵</a> <span class="text-muted">海航Java之路</span> <a class="tag" taget="_blank" href="/search/%E5%8A%9B%E6%89%A3/1.htm">力扣</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m==matrix.lengthn</div> </li> <li><a href="/article/1950231254427299840.htm" title="我不懂什么是爱,但我给你全部我拥有的" target="_blank">我不懂什么是爱,但我给你全部我拥有的</a> <span class="text-muted">香尧</span> <div>因为怕黑,所以愿意陪伴在夜中行走的人,给他一点点的安全感。因为渴望温柔与爱,所以愿意为别的孩子付出爱与温柔。因为曾遭受侮辱和伤害,所以不以同样的方式施于其他人。如果你向别人出之以利刃,对方还了你爱与包容,真的不要感激他,真的不要赞美他。每一个被人伤害过的人心里都留下了一颗仇恨的种子,他也会想要有一天以眼还眼,以牙还牙。但他未让那颗种子生根发芽,他用一把心剑又一次刺向他自己,用他血荐仇恨,开出一朵温</div> </li> <li><a href="/article/1950230873060208640.htm" title="你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。" target="_blank">你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。</a> <span class="text-muted">霖霖z</span> <div>打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪</div> </li> <li><a href="/article/1950230804957294592.htm" title="SpringMVC执行流程(原理),通俗易懂" target="_blank">SpringMVC执行流程(原理),通俗易懂</a> <span class="text-muted">国服冰</span> <a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提</div> </li> <li><a href="/article/1950230678696161280.htm" title="C++ 计数排序、归并排序、快速排序" target="_blank">C++ 计数排序、归并排序、快速排序</a> <span class="text-muted">每天搬一点点砖</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>计数排序:是一种基于哈希的排序算法。他的基本思想是通过统计每个元素的出现次数,然后根据统计结果将元素依次放入排序后的序列中。这种排序算法适用于范围较小的情况,例如整数范围在0到k之间计数排序步骤:1初始化一个长度为最大元素值加1的计数数组,所有元素初始化为02遍历原始数组,将每个元素值作为索引,在计数数组中对应位置加13将数组清空4遍历计数器数组,按照数组中的元素个数放回到元数组中计数排序的优点和</div> </li> <li><a href="/article/1950230114205757440.htm" title="现在发挥你的优势" target="_blank">现在发挥你的优势</a> <span class="text-muted">爱生活的佑嘉</span> <div>来和我做咨询的一些朋友,涉及到定位的,都会说,我不知道我的优势是什么,你能不能帮我看看?还有一些朋友,喜欢做各种测试来了解自己,测试过后,然并卵。今天,我想来聊聊优势,如何能了解自己的优势是什么。首先,我们要知道,如果要成为“不一般”的人,我们所做的事情,就要基于自身的优势。我做管理者十多年,看到每个员工都有不同的特长,有的擅长数字,有的擅长人际,有的擅长写作。这些知道自己优势并且在这方面刻意练习</div> </li> <li><a href="/article/1950229985633562624.htm" title="2023-11-02" target="_blank">2023-11-02</a> <span class="text-muted">一帆f</span> <div>发现浸润心田的感觉:今天一个机缘之下突然想分享我的婆媳关系,我一边分享一边回忆我之前和儿媳妇关系的微妙变化,特别是分享到我能感受到儿媳妇的各种美好,现在也能心平气和的和老公平等对话,看到自己看到老公,以己推人以人推己自然而然的换位思考,心中有一种美好的能量在涌动,一种浸润心田的感觉从心胸向全身扩散,美好极了……我很想记住这种感觉,赶紧把它写下来以留纪念,也就是当我看见他人的美好,美好的美妙的浸润心</div> </li> <li><a href="/article/1950229986984128512.htm" title="贫穷家庭的孩子考上985以后会怎样?" target="_blank">贫穷家庭的孩子考上985以后会怎样?</a> <span class="text-muted">Mellisa蜜思言</span> <div>我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我</div> </li> <li><a href="/article/1950229922647699456.htm" title="实时数据流计算引擎Flink和Spark剖析" target="_blank">实时数据流计算引擎Flink和Spark剖析</a> <span class="text-muted">程小舰</span> <a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>在过去几年,业界的主流流计算引擎大多采用SparkStreaming,随着近两年Flink的快速发展,Flink的使用也越来越广泛。与此同时,Spark针对SparkStreaming的不足,也继而推出了新的流计算组件。本文旨在深入分析不同的流计算引擎的内在机制和功能特点,为流处理场景的选型提供参考。(DLab数据实验室w.x.公众号出品)一.SparkStreamingSparkStreamin</div> </li> <li><a href="/article/1950229418706268160.htm" title="密码正则验证:大小写字母、数字、特殊字符至少8位" target="_blank">密码正则验证:大小写字母、数字、特殊字符至少8位</a> <span class="text-muted">qq_21875331</span> <a class="tag" taget="_blank" href="/search/%E6%B8%90%E8%BF%9B%E5%BC%8F%E7%9A%84%E6%88%90%E9%95%BF/1.htm">渐进式的成长</a> <div>正则表达式:密码必须包含大写字母、数字、特殊字符(四种里至少三种,且至少8位)写法一:/((^(?=.*[a-z])(?=.*[A-Z])(?=.*\W)[\da-zA-Z\W]{8,16}$)|(^(?=.*\d)(?=.*[A-Z])(?=.*\W)[\da-zA-Z\W]{8,16}$)|(^(?=.*\d)(?=.*[a-z])(?=.*\W)[\da-zA-Z\W]{8,16}$)|(^</div> </li> <li><a href="/article/1950229040682037248.htm" title="48. 旋转图像 - 力扣(LeetCode)" target="_blank">48. 旋转图像 - 力扣(LeetCode)</a> <span class="text-muted">Fiee-77</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a> <div>题目:给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例2:输入:matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,</div> </li> <li><a href="/article/52.htm" title="解读Servlet原理篇二---GenericServlet与HttpServlet" target="_blank">解读Servlet原理篇二---GenericServlet与HttpServlet</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/HttpServlet/1.htm">HttpServlet</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%90%86/1.htm">源理</a><a class="tag" taget="_blank" href="/search/GenericService/1.htm">GenericService</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a> <div>在上一篇《解读Servlet原理篇一》中提到,要实现javax.servlet.Servlet接口(即写自己的Servlet应用),你可以写一个继承自javax.servlet.GenericServletr的generic Servlet ,也可以写一个继承自java.servlet.http.HttpServlet的HTTP Servlet(这就是为什么我们自定义的Servlet通常是exte</div> </li> <li><a href="/article/179.htm" title="MySQL性能优化" target="_blank">MySQL性能优化</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>        性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:         a.优化查询         b.优化数据库结构   </div> </li> <li><a href="/article/306.htm" title="ThreadPool定时重试" target="_blank">ThreadPool定时重试</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ThreadPool/1.htm">ThreadPool</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a><a class="tag" taget="_blank" href="/search/timertask/1.htm">timertask</a> <div>项目需要当某事件触发时,执行http请求任务,失败时需要有重试机制,并根据失败次数的增加,重试间隔也相应增加,任务可能并发。 由于是耗时任务,首先考虑的就是用线程来实现,并且为了节约资源,因而选择线程池。 为了解决不定间隔的重试,选择Timer和TimerTask来完成 package threadpool; public class ThreadPoolTest { </div> </li> <li><a href="/article/433.htm" title="Oracle 查看数据库的连接情况" target="_blank">Oracle 查看数据库的连接情况</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/oracle+%E8%BF%9E%E6%8E%A5/1.htm">oracle 连接</a> <div>首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表。 select * from dict where table_name like '%SESSION%'; 就可以查出一些表,然后根据这些表就可以获得会话信息 select sid,serial#,status,username,schemaname,osuser,terminal,ma</div> </li> <li><a href="/article/560.htm" title="类的继承" target="_blank">类的继承</a> <span class="text-muted">朱辉辉33</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>类的继承可以提高代码的重用行,减少冗余代码;还能提高代码的扩展性。Java继承的关键字是extends 格式:public class 类名(子类)extends 类名(父类){ } 子类可以继承到父类所有的属性和普通方法,但不能继承构造方法。且子类可以直接使用父类的public和 protected属性,但要使用private属性仍需通过调用。 子类的方法可以重写,但必须和父类的返回值类</div> </li> <li><a href="/article/687.htm" title="android 悬浮窗特效" target="_blank">android 悬浮窗特效</a> <span class="text-muted">肆无忌惮_</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>最近在开发项目的时候需要做一个悬浮层的动画,类似于支付宝掉钱动画。但是区别在于,需求是浮出一个窗口,之后边缩放边位移至屏幕右下角标签处。效果图如下:   一开始考虑用自定义View来做。后来发现开线程让其移动很卡,ListView+动画也没法精确定位到目标点。   后来想利用Dialog的dismiss动画来完成。   自定义一个Dialog后,在styl</div> </li> <li><a href="/article/814.htm" title="hadoop伪分布式搭建" target="_blank">hadoop伪分布式搭建</a> <span class="text-muted">林鹤霄</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>要修改4个文件    1: vim hadoop-env.sh  第九行    2: vim core-site.xml            <configuration>     &n</div> </li> <li><a href="/article/941.htm" title="gdb调试命令" target="_blank">gdb调试命令</a> <span class="text-muted">aigo</span> <a class="tag" taget="_blank" href="/search/gdb/1.htm">gdb</a> <div>原文:http://blog.csdn.net/hanchaoman/article/details/5517362   一、GDB常用命令简介   r run 运行.程序还没有运行前使用 c             cuntinue </div> </li> <li><a href="/article/1068.htm" title="Socket编程的HelloWorld实例" target="_blank">Socket编程的HelloWorld实例</a> <span class="text-muted">alleni123</span> <a class="tag" taget="_blank" href="/search/socket/1.htm">socket</a> <div>public class Client { public static void main(String[] args) { Client c=new Client(); c.receiveMessage(); } public void receiveMessage(){ Socket s=null; BufferedRea</div> </li> <li><a href="/article/1195.htm" title="线程同步和异步" target="_blank">线程同步和异步</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5/1.htm">线程同步</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%AD%A5/1.htm">异步</a> <div>多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法   多线程和异步:多线程可以做不同的事情,涉及到线程通知     &</div> </li> <li><a href="/article/1322.htm" title="JSP中文乱码分析" target="_blank">JSP中文乱码分析</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81/1.htm">中文乱码</a> <div>        在JSP的开发过程中,经常出现中文乱码的问题。         首先了解一下Java中文问题的由来:         Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,</div> </li> <li><a href="/article/1449.htm" title="js实现页面跳转重定向的几种方式" target="_blank">js实现页面跳转重定向的几种方式</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E9%87%8D%E5%AE%9A%E5%90%91/1.htm">重定向</a> <div>        js实现页面跳转重定向有如下几种方式: 一.window.location.href <script language="javascript"type="text/javascript"> window.location.href="http://www.baidu.c</div> </li> <li><a href="/article/1576.htm" title="【Struts2三】Struts2 Action转发类型" target="_blank">【Struts2三】Struts2 Action转发类型</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/struts2/1.htm">struts2</a> <div> 在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下   <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configurat</div> </li> <li><a href="/article/1703.htm" title="【HBase十一】Java API操作HBase" target="_blank">【HBase十一】Java API操作HBase</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a> <div>Admin类的主要方法注释:   1. 创建表 /** * Creates a new table. Synchronous operation. * * @param desc table descriptor for table * @throws IllegalArgumentException if the table name is res</div> </li> <li><a href="/article/1830.htm" title="nginx gzip" target="_blank">nginx gzip</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/nginx+gzip/1.htm">nginx gzip</a> <div>Nginx GZip 压缩 Nginx GZip 模块文档详见:http://wiki.nginx.org/HttpGzipModule 常用配置片段如下: gzip on; gzip_comp_level 2; # 压缩比例,比例越大,压缩时间越长。默认是1 gzip_types text/css text/javascript; # 哪些文件可以被压缩 gzip_disable &q</div> </li> <li><a href="/article/1957.htm" title="java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交" target="_blank">java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class LinkListTest { /** * we deal with two main missions: * * A. * 1.we create two joined-List(both have no loop) * 2.whether list1 and list2 join * 3.print the join</div> </li> <li><a href="/article/2084.htm" title="Spring源码学习-JdbcTemplate batchUpdate批量操作" target="_blank">Spring源码学习-JdbcTemplate batchUpdate批量操作</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>Spring JdbcTemplate的batch操作最后还是利用了JDBC提供的方法,Spring只是做了一下改造和封装 JDBC的batch操作: String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; </div> </li> <li><a href="/article/2211.htm" title="[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展" target="_blank">[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">工作流</a> <div>    生成和创建类已经完成,构造一个100万个元素的矩阵模型,存储空间只有11M大,请大家参考我在博客园上面的文档"构造下一代工作流存储结构的尝试",更加相信的设计和代码将陆续推出.........     竞争对手的能力也很强.......,我相信..你们一定能够先于我们推出大规模拓扑扫描和分析系统的....</div> </li> <li><a href="/article/2338.htm" title="base64编码和url编码" target="_blank">base64编码和url编码</a> <span class="text-muted">cuityang</span> <a class="tag" taget="_blank" href="/search/base64/1.htm">base64</a><a class="tag" taget="_blank" href="/search/url/1.htm">url</a> <div>import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; </div> </li> <li><a href="/article/2465.htm" title="web应用集群Session保持" target="_blank">web应用集群Session保持</a> <span class="text-muted">dalan_123</span> <a class="tag" taget="_blank" href="/search/session/1.htm">session</a> <div>关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享。建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,一举几得啊。1、使用 filter 方法存储这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简</div> </li> <li><a href="/article/2719.htm" title="Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']" target="_blank">Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>    public function getMinLimit () {        $sql = "...";        $result = yii::app()->db->createCo</div> </li> <li><a href="/article/2846.htm" title="solr StatsComponent(聚合统计)" target="_blank">solr StatsComponent(聚合统计)</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/solr%E8%81%9A%E5%90%88%E6%9F%A5%E8%AF%A2/1.htm">solr聚合查询</a><a class="tag" taget="_blank" href="/search/solr+stats/1.htm">solr stats</a> <div>StatsComponent 转载请出自出处:http://eksliang.iteye.com/blog/2169134 http://eksliang.iteye.com/ 一、概述        Solr可以利用StatsComponent 实现数据库的聚合统计查询,也就是min、max、avg、count、sum的功能   二、参数</div> </li> <li><a href="/article/2973.htm" title="百度一道面试题" target="_blank">百度一道面试题</a> <span class="text-muted">greemranqq</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E5%BA%A6%E9%9D%A2%E8%AF%95/1.htm">百度面试</a><a class="tag" taget="_blank" href="/search/%E5%AF%BB%E6%89%BE%E5%A5%87%E6%95%B0%E7%AE%97%E6%B3%95/1.htm">寻找奇数算法</a><a class="tag" taget="_blank" href="/search/bitmap+%E7%AE%97%E6%B3%95/1.htm">bitmap 算法</a> <div>那天看朋友提了一个百度面试的题目:怎么找出{1,1,2,3,3,4,4,4,5,5,5,5}  找出出现次数为奇数的数字.   我这里复制的是原话,当然顺序是不一定的,很多拿到题目第一反应就是用map,当然可以解决,但是效率不高。   还有人觉得应该用算法xxx,我是没想到用啥算法好...!   还有觉得应该先排序...   还有觉</div> </li> <li><a href="/article/3100.htm" title="Spring之在开发中使用SpringJDBC" target="_blank">Spring之在开发中使用SpringJDBC</a> <span class="text-muted">ihuning</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>  在实际开发中使用SpringJDBC有两种方式:   1. 在Dao中添加属性JdbcTemplate并用Spring注入;     JdbcTemplate类被设计成为线程安全的,所以可以在IOC 容器中声明它的单个实例,并将这个实例注入到所有的 DAO 实例中。JdbcTemplate也利用了Java 1.5 的特定(自动装箱,泛型,可变长度</div> </li> <li><a href="/article/3227.htm" title="JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节" target="_blank">JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节</a> <span class="text-muted">justjavac</span> <a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>2013年5月,Yehuda Katz 完成了JSON API(英文,中文) 技术规范的初稿。事情就发生在 RailsConf 之后,在那次会议上他和 Steve Klabnik 就 JSON 雏形的技术细节相聊甚欢。在沟通单一 Rails 服务器库—— ActiveModel::Serializers 和单一 JavaScript 客户端库——&</div> </li> <li><a href="/article/3354.htm" title="网站项目建设流程概述" target="_blank">网站项目建设流程概述</a> <span class="text-muted">macroli</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>一.概念 网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。 二.需求分析 项目立项   我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。 客户的需求说明书   第一步是需</div> </li> <li><a href="/article/3481.htm" title="AngularJs 三目运算 表达式判断" target="_blank">AngularJs 三目运算 表达式判断</a> <span class="text-muted">qiaolevip</span> <a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/%E4%BC%97%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">众观千象</a><a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a> <div>事件回顾:由于需要修改同一个模板,里面包含2个不同的内容,第一个里面使用的时间差和第二个里面名称不一样,其他过滤器,内容都大同小异。希望杜绝If这样比较傻的来判断if-show or not,继续追究其源码。 var b = "{{", a = "}}"; this.startSymbol = function(a) { </div> </li> <li><a href="/article/3608.htm" title="Spark算子:统计RDD分区中的元素及数量" target="_blank">Spark算子:统计RDD分区中的元素及数量</a> <span class="text-muted">superlxw1234</span> <a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/spark%E7%AE%97%E5%AD%90/1.htm">spark算子</a><a class="tag" taget="_blank" href="/search/Spark+RDD%E5%88%86%E5%8C%BA%E5%85%83%E7%B4%A0/1.htm">Spark RDD分区元素</a> <div>关键字:Spark算子、Spark RDD分区、Spark RDD分区元素数量     Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。   可以利用RDD的mapPartitionsWithInd</div> </li> <li><a href="/article/3735.htm" title="Spring 3.2.x将于2016年12月31日停止支持" target="_blank">Spring 3.2.x将于2016年12月31日停止支持</a> <span class="text-muted">wiselyman</span> <a class="tag" taget="_blank" href="/search/Spring+3/1.htm">Spring 3</a> <div>              Spring 团队公布在2016年12月31日停止对Spring Framework 3.2.x(包含tomcat 6.x)的支持。在此之前spring团队将持续发布3.2.x的维护版本。          请大家及时准备及时升级到Spring </div> </li> <li><a href="/article/3862.htm" title="fis纯前端解决方案fis-pure" target="_blank">fis纯前端解决方案fis-pure</a> <span class="text-muted">zccst</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>作者:zccst FIS通过插件扩展可以完美的支持模块化的前端开发方案,我们通过FIS的二次封装能力,封装了一个功能完备的纯前端模块化方案pure。 1,fis-pure的安装 $ fis install -g fis-pure $ pure -v 0.1.4 2,下载demo到本地 git clone https://github.com/hefangshi/f</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>