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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
  • 类是模板,而实例则是根据类创建的对象。

    绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

    定义类属性可以直接在 class 中定义:

    class Person(object):    address = 'Earth'
        def __init__(self, name):
            self.name = name

    因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问:

    print Person.address# => Earth

    对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性:

    p1 = Person('Bob')
    p2 = Person('Alice')
    print p1.address
    # => Earthprint
     p2.address
     # => Earth

    由于Python是动态语言,类属性也是可以动态添加和修改的:

    Person.address = 'China'
    print p1.address
    # => 'China'
    print p2.address
    # => 'China'

    因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了。

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


    查看全部
  • python中访问限制

    我们可以给一个实例绑定很多属性,如果有些属性不希望被外部访问到怎么办?

    Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。看例子:

    class Person(object):     
        def __init__(self, name):    
            self.name = name         
            self._title = 'Mr'         
            self.__job = 'Student' 
    p = Person('Bob') 
    print p.name 
    # => Bob 
    print p._title 
    # => Mr 
    print p.__job 
    # => Error 
    Traceback (most recent call last):   
        File "<stdin>", line 1, in <module> 
    AttributeError: 'Person' object has no attribute '__job'

    可见,只有以双下划线开头的"__job"不能直接被外部访问。

    但是,如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。

    单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。


    查看全部
  • python中初始化实例属性

    在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:

    class Person(object):    
     def __init__(self, name, gender, birth):        
      self.name = name        
       self.gender = gender        
        self.birth = birth

    __init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。

    相应地,创建实例时,就必须要提供除 self 以外的参数:

    有了__init__()方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:

    要特别注意的是,初学者定义__init__()方法常常忘记了 self 参数:

    >>> class Person(object): ...     def __init__(name, gender, birth): ...         pass ...  >>> xiaoming = Person('Xiao Ming', 'Male', '1990-1-1') Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: __init__() takes exactly 3 arguments (4 given)

    这会导致创建失败或运行不正常,因为第一个参数name被Python解释器传入了实例的引用,从而导致整个方法的调用参数位置全部没有对上。

    class Person(object):
        def __init__(self, name, gender, birth, **kw):
            self.name = name
            self.gender = gender
            self.birth = birth
            for k, v in kw.iteritems():
                setattr(self, k, v)

    解释器内部会将**kw拆分成对应的dict.
    setattr()方法接受3个参数:setattr(对象,属性,属性的值)
    setattr(self,k,v)相当于self.k = v
    kw.iteritems()历遍字典kw的所有key和value,分别匹配k,v

    查看全部
  • 按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。类的继承将在后面的章节讲解,现在我们只需要简单地从object类继承。

    有了Person类的定义,就可以创建出具体的xiaoming、xiaohong等实例。创建实例使用 类名+()


    查看全部
  • Python中的__str__()和__repr__()方法

    如果要把一个类的实例变成str  就需要实现特殊的方法__str__()先对原始的方法进行重写;

    查看全部
  • 注意:sorted()是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素x,y,如果x应该排在y前面,返回-1,如果x应该排在y的后面,返回1,如果x和y相等,返回0

    查看全部
  • python变量前的_和__的区别?

    查看全部
  • 1)特殊方法在Python中又称为魔术方法

    例如:print()方法,   print list    和 print p  前者print一个list会打印出list所存的字符串  后者print一个实例会打印出一个包含有该类的实例的属性的一个字符串,[1,2,3]    <__main__.Person object  at  一个十六进制表示的地址 >

    2)Python如何将任意变量转换成str的

    因为任何数据类型的实例都有一个特殊方法   __str__( )

    print list实际上就是调用list的__str__()方法   相当于print list.__str__()

    打印Person的实例   就是调用实例p的__str__()方法

    3)如果给自定义类的实例加上一个特殊的方法,即可以自定义打印需要的字符串

    例如:

    class Person(object):

         def __init__(self,name,age):

              self.name=name

              self.age=age

        def __str__(self):

             return 'Person'%s self.name %s self.age  

    p=Person('xiao hong',14)

    print p

    输出结果   <Person:xiao hong,14>

    4)Python的常见的特殊方法

    用于print函数的__str__()

    用于len函数的__len__()

    用于比较函数的__cmp__()

    .......

    5)Python中特殊方法的特点

    特殊方法定义在class中

    特殊方法不需要显式直接地去调用

    Python的某些函数和操作符会自动地去调用它

    6)正确地实现特殊方法

    只需要编写用到的特殊方法

    有关联性都必须实现它   例如:getattr() setattr() delattr()方法

    备注:实际实现特殊方法就是对原有的方法进行重写

    例如:如果对类的print函数的__str__()方法进行重写,我们在调用print函数时就是调用重写后的方法了

    def __str__(self):

            return '(Student:%s,%s,%s)'%(self.name,self.gender,self.score)

    s=Student('xiao hong','male',99)

    print s

    #输出 Student: xiao hong,male,99

    查看全部
  • 注意:map()函数不改变原有的 list,而是返回一个新的 list。

    利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。

    由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。


    查看全部
  • def count():
        fs = []
        for i in range(1, 4):
            def f(j):
                def g():
                    return j*j
                return g
            r = f(i)
            fs.append(r)
        return fs
    f1, f2, f3 = count()
    print f1(), f2(), f3()


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

    2018-04-09

  • 2-8至2-14???

    查看全部
    0 采集 收起 来源:python中偏函数

    2018-04-08

  • sorted函数接受的函数来规定了排序规则

    查看全部
  • map()接受一参数函数

    rreduce()接受双参数函数

    filter()接受布尔参数函数

    查看全部
  • 其实这里多态的意思就是: 对不同对象, 调用了同一个名字的方法 some_func ,  可以表现出不同的状态, 返回不同的结果.

    查看全部
    0 采集 收起 来源:python中多态

    2018-04-08

  • 2-8返回函数不会

    查看全部

举报

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

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