为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
python进阶_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分

  • class Person(object):
       __count = 0
       def __init__(self, name):
           Person.__count = Person.__count + 1
           self.name = name
           print Person.__count

    p1 = Person('Bob')
    p2 = Person('Alice')

    print Person.__count

    运行失败

    Traceback (most recent call last):
      File "index.py", line 11, in 
        print Person.__count
    AttributeError: type object 'Person' has no attribute '__count'
    1
    2


    定义中含有print,实例化过程两次调用,输出1,2,在外部访问Person.count时,报错,外部直接访问不允许

    查看全部
  • python中的特殊方法:

    1. __str__和__repr__:__str__()用于显示给用户,而__repr__()用于显示给开发人员

      示例:

      https://img1.sycdn.imooc.com//5bfd02460001658f05920173.jpg

    2. __cmp__:python3.4以上取消了__cmp__函数,二用__eq__、__lt__、__rt__函数代替

      示例:

      https://img1.sycdn.imooc.com//5bfd0b610001fb2d02490244.jpg

    3. __len__:如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数。要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数

      示例:

      https://img1.sycdn.imooc.com//5bfd14850001f52d03880379.jpg

    4. 类型转换:要让int()函数正常工作,只需要实现特殊方法__int__(),,要让float()函数正常工作,只需要实现特殊方法__float__()。

    5. @property:使用 get/set 方法来封装对一个属性的访问在许多面向对象编程的语言中都很常见。但是写 s.get_score() 和 s.set_score() 没有直接写 s.score 来得直接。故可以用装饰器函数把 get/set 方法“装饰”成属性调用

      https://img1.sycdn.imooc.com//5bfd1e3d0001d10603730311.jpg

    6. __slots__和__dict__:由于Python是动态语言,任何实例在运行期都可以动态地添加属性。如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利用Python的一个特殊的__slots__来实现。

      注意:在缺少 __dict__ 变量的情况下,实例不能接受新的不在 __slots__ 声明内的变量作为属性。继承一个没有 __slots__ 属性的类时,子类会自动拥有 __dict__ 属性,因此在子类中定义 __slots__ 是毫无意义的。含有 __slots__ 的类的子类会自动创建一个 __dict__,除非在子类中也声明一个 __slots__ (在这个 __slots__ 声明应该只包含父类未声明的变量)

      示例:

      https://img1.sycdn.imooc.com//5bfd28df000170f003430219.jpg

    7. 所有的函数都是可调用对象。一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。

      示例:

      https://img1.sycdn.imooc.com//5bfd2a710001a3b203740310.jpg

    查看全部
  • https://img1.sycdn.imooc.com//5bfcf9480001f62503670353.jpg这段话有疑问

    查看全部
  • import time
    print "time.time(): %f " %  time.time()
    print time.localtime( time.time() )
    print time.asctime( time.localtime(time.time()) )
    查看全部
  • %s    字符串 (采用str()的显示)

    %r    字符串 (采用repr()的显示)

    %c    单个字符

    %b    二进制整数

    %d    十进制整数

    %i    十进制整数

    %o    八进制整数

    %x    十六进制整数

    %e    指数 (基底写为e)

    %E    指数 (基底写为E)

    %f    浮点数

    %F    浮点数与上相同

    %g    指数(e)或浮点数 (根据显示长度)

    %G    指数(E)或浮点数 (根据显示长度)


    查看全部
  • 'call %s() in %fs' % (f.__name__,(t2-t1))这个代码中应该是可以这样断句 'call     %s     () in     %f     s'  这个是打印出来的东西,其中call照常打印+ %s是对应打印字符串+()in照常打印+%f是打印数字的浮点数+s是秒的意思照常打印。

    然后后面的 (f.__name__,(t2-t1))中就分别对应前面的字符串和数字。f.__name__就是表示函数名称的意思


    查看全部
  • print 'call %s() in %fs' % (f.__name__, (t2 - t1))

    %f是格式化输出浮点数;而s就是一个字符,是时间单位秒

    查看全部
  • 所谓装饰器,你可以理解为:在保持原函数factorial(n)内部程序不变的基础上,给他增加一行代码 print ('call '+ f.__name__ + '()...'),得到一个新函数,而现在我们又把这个新函数也命名为factorial(n)。于是我们可以看作是factorial()的功能增强了(原函数只能计算阶乘,新函数不仅可以计算阶乘还能打印出函数名称),也就是可以看成是原函数factorial(n)被装饰了一下,加了一行输出代码,所以叫做装饰器。

    大家在学这个装饰器的时可以先忽略掉@Log这个标志,因为@Log其实就相当于:factorial=Log(factorial)这行代码(代码位置再调整到factorial()函数的后面)。所以,使用@Log这种标志只是将代码减少了自己字母,大家不要被这个@符号蒙蔽了。你就把它看作是一行正常的factorial=Log(factorial)代码,并放到最后一个print前面就行。


    查看全部
  • 其实包装器就是将对把函数当做一个参数传进去,然后在这个函数正式执行前或者后进行一些处理

    1.函数执行前处理

    2.执行函数

    3.函数执行后处理


    查看全部
  • 注意到   fs.append(f)中传入的为一个函数f,即在list中对应着三个函数地址(试试print f1,f2,f3 会显示为三个地址),调用f1,f2,f3 时则都对应着调用f函数,此时for循环已经结束,最终赋值为3,即return 3*3。

    尝试改写函数: fs.append(f()),此时传入list为三个值1,4,9.即[1,4,9],当执行f1,f2,f3=count()语句时,为依次取出list表中的值,即1,4,9


    查看全部
    0 采集 收起 来源:python中闭包

    2018-11-27

  • 调用后返回的count()是函数,就是f1=f(i) f2=f(i) f3=f(i),而i又一直在改变,最后就是3

    查看全部
    0 采集 收起 来源:python中闭包

    2018-11-27

  • def f1(x):

           return x*2

    def a(b):

           def c(x):

                 print "d"

                 return b(x)      #返回的是高阶函数a的参数(函数b)的指

           return c    #返回函数c



    查看全部
    1. python继承:继承只需要添加额外的属性和功能

      示例:

      https://img1.sycdn.imooc.com//5bfaaacc0001419203620162.jpg

      函数super(Student, self)将返回当前类继承的父类,即 Person ,然后调用__init__()方法,注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)

    2. 判断类型:函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型。

    3. 多态

      示例:

      https://img1.sycdn.imooc.com//5bfaad3100016dd102950310.jpg

      https://img1.sycdn.imooc.com//5bfaad490001af7900990052.jpg

    4. python中的多重继承:python允许继承多个父类,且每个父类的__init__方法仅调用一次

    5. 首先可以用 type() 函数获取变量的类型,它返回一个 Type 对象。其次,可以用 dir() 函数获取变量的所有属性。如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了。

      https://img1.sycdn.imooc.com//5bfab44b0001534103920115.jpg

      示例:

      https://img1.sycdn.imooc.com//5bfab42f0001d40703820148.jpg

    查看全部
  • 注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。

    当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),如下:

    a = '     123'
    a.strip()

    结果: '123'

    a='\t\t123\r\n'
    a.strip()

    结果:'123'


    查看全部
    1. python面向对象编程:

      (1)创建类:

       class Person(object): #(object)表示该类是从哪个类继承下来的,类名以大写字母开头

          example....

      (3)创建实例:

      xiaoMing=Person()

    2. 创建实例属性

      实例被创建后,可以直接添加属性,并给其属性赋值:xiaoMing.name='小明'

    3. 初始化实例属性:创建类时,添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上多个属性

      示例:

      https://img1.sycdn.imooc.com//5bf9405300019b6b03130144.jpg

    4. python访问限制:Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问;如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,通常我们不使用;以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问

    5. 创建类属性:使例属性每个实例各自拥有,互相独立,而类属性有且只有一份。因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问。对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性。由于Python是动态语言,类属性也是可以动态添加和修改的

      示例:

      https://img1.sycdn.imooc.com//5bf9477e0001713404610148.jpg

    6. 类属性名与实例属性名冲突:当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

    7. 定义实例方法:实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的

      调用实例方法必须在实例上调用,在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度

      示例:

      https://img1.sycdn.imooc.com//5bfa952100014ee202660254.jpg

    8. python中方法也是属性:在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象。因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法

      示例:

      https://img1.sycdn.imooc.com//5bfa97e6000115ae04820182.jpg

      https://img1.sycdn.imooc.com//5bfa97fd0001563205250069.jpg

    9. 定义类方法:类中的方法分为实例方法和类方法:在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。要在class中定义类方法,需要通过标记一个 @classmethod,将方法将绑定到 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls

    10. https://img1.sycdn.imooc.com//5bfa98f70001939b02490187.jpg

    查看全部

举报

0/150
提交
取消
课程须知
本课程是Python入门的后续课程 1、掌握Python编程的基础知识 2、掌握Python函数的编写 3、对面向对象编程有所了解更佳
老师告诉你能学到什么?
1、什么是函数式编程 2、Python的函数式编程特点 3、Python的模块 4、Python面向对象编程 5、Python强大的定制类
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!