zoukankan      html  css  js  c++  java
  • Python基础教程——9魔法方法、属性及迭代器【总结】

    1 旧式类和新式类

    确保使用新式类:把__metaclass__=type放在模块的最开始【mataclass 元类】

       或者

      class MyClass(object):#子类化内建类object或者其他新式类

        # do something

       而使用旧式类:

      class MyClass:

      # do something

    而在Python 3.0中没有旧式的类,也就不需要显式地子类化object或者将元类设置为type。所有的类都会隐式地成为object的子类——如果没有明确超类的话,就会直接子类化;否则就会间接子类化。

    2归生成器和模拟生成器 

    递归生成器

    def flatten(nested):
    try:
    try: nested + ''
    except TypeError:pass
    else: raise TypeError
    for sublist in nested:
    for element in flatten(sublist):
    yield element
    except TypeError:
    yield nested


    >>> list(flatten(['sdss',['sss',['fff']]]))
    ['sdss', 'sss', 'fff']


    模拟生成器
    >>> def flatten(nested):
    result = []
    try:
    try: nested + ''
    except TypeError:pass
    else: raise TypeError
    for sublist in nested:
    for element in flatten(sublist):
    result.append(element)
    except TypeError:
    result.append(nested)
    return result


    3 八皇后回溯

    def conflict(state,nextX):
        nextY = len(state)
        for i in range(nextY):
       if abs(state[i] - nextX) in (0, nextY - i):
       return True
        return False
    def queens(num = 8, state = ()):
        for pos in range(num):
            if not conflict(state,pos):
                if len(state) == num - 1:
                    yield (pos,)
                else:
                    for result in queens(num,state+(pos,)):
                        yield (pos,) + result
    def prettyprint(solution):
        def line(pos,length = len(solution)):
            return '. '*(pos) + 'X '+ '. '*(length-pos-1)
        for pos in solution:
            print line(pos)



    import random
    prettyprint(random.choice(list(queens(8))))
    print list(queens(3))
    print list(queens(4))
    print len(list(queens(5)))

    print len(list(queens(8)))

    运行结果

    >>> 
    . X . . . . . . 
    . . . . . X . . 
    . . . . . . . X 
    . . X . . . . . 
    X . . . . . . . 
    . . . X . . . . 
    . . . . . . X . 
    . . . . X . . . 
    []
    [(1, 3, 0, 2), (2, 0, 3, 1)]
    10
    92


    4 第九章总结

    1 旧式类和新式类:

    为了创建新式类必须直接或者间接子类化object,或者设置__metaclass__属性为type

    2 魔法方法:

    在某种情况下会被Python自动调用,比如,__init__在对象被创建后立即自动调用

    3 构造方法

    这是面向对象语言的共有的,可能要为自己写的每个类实现构造方法。构造方法被命名为__init__并且在对象被创建后立即自动调用

    重写

    一个类能通过实现方法来重写他的超类中定义的这些方法和属性。如果新方法要调用重写版本的方法,可以从超类直接调用未绑定版本——超类名.__init(self)或者使用super函数——super(当前类,当前对象).__init__()

    5 序列和映射

    创建自己的序列或者映射需要实现所有的序列或者映射规则的方法,包括__getitem__和__setitem__这样的特殊方法。

    通过子类化list和dict能节省很多工作

    6迭代器:

    迭代器是带有next方法的简单对象。迭代器能在一系列的值上进行迭代。当没有值可供迭代时,next方法就会引发StopIteration异常。

    可迭代对象有一个返回迭代器的__iter__方法,它能像序列那样在for循环中使用。

    一般来说,迭代器本身也是可迭代的,即迭代器有返回自己的next方法。

    7 生成器

    生成器函数包括了关键字yield的函数

    当被调用时,生成器函数返回一个生成器——一种特殊的迭代器。可以使用send,throw,close方法让活动生成器和外界交互

    8 八皇后问题

    9 静态方法 和 类成员方法

    静态方法:没有self参数,可以被类本身直接调用

    类方法:需要cls参数,可以直接用类的具体参数调用


  • 相关阅读:
    Docker镜像与仓库(四)
    Docker网络与存储(三)
    Docker基本使用(一)
    虚拟化KVM之优化(三)
    修改CENTOS7的网卡ens33修改为eth0
    虚拟化KVM之安装(二)
    虚拟化KVM之概述(一)
    Python不同版本打包程序为.exe文件
    JSON
    同源策略(same-origin policy)及三种跨域方法
  • 原文地址:https://www.cnblogs.com/miki/p/3308564.html
Copyright © 2011-2022 走看看