为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.17
567人评价 查看评价
9.6 内容实用
9.0 简洁易懂
8.9 逻辑清晰
  • 类的方法,实例可以用。但是实例的方法,类不可以。

    def __init__(self, name):

            self.name = name

            Person.__count = Person.__count+1

    Self 相当于实例,如果Person.__count改成了Self.__count就相当于给实例加了一个属性。如果想让类叠加上去,就得Person.__count

  • 在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。

    和属性类似,方法也分实例方法和类方法。

    要在class中定义类方法,需要这么写:

    class Person(object):
        count = 0    @classmethod
        def how_many(cls):
            return cls.count
        def __init__(self, name):
            self.name = name
            Person.count = Person.count + 1
    
    print Person.how_many()
    p1 = Person('Bob')
    print Person.how_many()

    通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。

    因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。

  • 只是需要用 types.MethodType() 把一个函数变为一个方法.

    p1 = Person('Bob', 90)
    p1.get_grade = 
    types.MethodType(fn_get_grade, p1, Person)
    print p1.get_grade()# => A


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

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

  • 当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

    可见,千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性

  • 创建实例必定会调用__init__()方法

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

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

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


  • 要定义关键字参数,使用 **kw;

    除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。


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

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

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

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


  • 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下:

    class Person(object):
        pass

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

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

    xiaoming = Person()
    xiaohong = Person()


  • try:
        from cStringIO import StringIO
    except ImportError:
        from StringIO import StringIO

    try 的作用是捕获错误,并在捕获到指定错误时执行 except 语句。

  • 如果使用 from...import 导入 log 函数,
    势必引起冲突。这时,
    可以给函数起个“别名”来避免冲突
    from logging import log as logger


  • __call__

    作用:使类可以直接像函数一样被使用。

    代码:

    class Fib(object):

        def __init__(self):

            self.t=[0,1]

        def __call__(self,friend):

            for i in range(2,friend):

                self.t.append(self.t[i-1]+self.t[i-2])

            return self.t


    f = Fib()

    print f(10)


  • __slots__

    作用:限制实例中属性的任意添加。(由于Python是动态语言,任何实例在运行期都可以动态地添加属性。)

    例:

    class Student(object):
        __slots__ = ('name', 'gender', 'score')
        def __init__(self, name, gender, score):
            self.name = name
            self.gender = gender
            self.score = score
    >>>s = Student('Bob', 'male', 59)
    >>> s.name = 'Tim' # OK
    >>> s.score = 99 # OK
    >>> s.grade = 'A'(无法添加,被限制)


  • @property对输出加以修饰或判断(检查属性的有效性)。

    如:

    def get_score(self):
            return self.__score
        def set_score(self, score):
            if score < 0 or score > 100:
                raise ValueError('invalid score')
            self.__score = score
    
    s.self_score(s)
    s.self_score()

    但想需要更简单点,直接些s.score=??就可以判断

    则如下:

    @property
        def score(self):
            return self.__score
        @score.setter
        def score(self, score):
            if score < 0 or score > 100:
                raise ValueError('invalid score')
            self.__score = score


  • __int__(self): 转化为下取整整数。

    __float__(self): 转化为浮点数。

    p//q: 指相除后下取整整数。

    例:

        def __int__(self):

            return self.p // self.q


        def __float__(self):

            return self.p*1.0/self.q


    print int(Rational(7, 2))

    print float(Rational(1, 3))


  • __add__(): 加,__sub__(): 减,__mul__(): 乘,__div__(): 除。

    具体操作代码:

        def __add__(self, r):
            return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
        def __str__(self):
            return '%s/%s' % (self.p, self.q)
        __repr__ = __str__
    >>> r1 = Rational(1, 3)
    >>> r2 = Rational(1, 2)
    >>> print r1 + r2
    5/6


  • __len__(): 返回该类实例的“长度”。

    例:

    class Fib(object):


        def __init__(self, num):

            self.num=num

            self.t = [0,1]

            for i in range(2,self.num):

                self.t.append(self.t[i-1] + self.t[i-2])

        def __str__(self):

            return str(self.t)

            

        def __len__(self):

            return len(self.t)


    f = Fib(10)

    print f

    print len(f)


  • sorted(L) == sorted(L,__cmp__)

    例:

    class Student(object):


        def __init__(self, name, score):

            self.name = name

            self.score = score


        def __str__(self):

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


        __repr__ = __str__


        def __cmp__(self, s):

            if self.score >s.score:

                return -1

            elif self.score <s.score:

                return 1

            else:

                if self.name >s.name:

                    return 1

                else:

                    return -1

    #      return -cmp(self.score, s.score) or cmp(self.name, s.name)


    L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99)]

    print sorted(L)


  • 特殊方法:

    print s == print s.__str__()

    __str__()用于显示给用户,而__repr__()用于显示给开发人员。

  • type(s): 返回s的类型

    例:

    >>> type(123)
    <type 'int'>

    dir(s): 返回有关的所有属性。

    例:

    >>> dir(s)
    ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gender', 'name', 'score', 'whoAmI']

    getattr(s,'name',) ==s.name

    setattr(s,'name','Adam') == s.name='Adam'

    getattr(s,'name','Adam') == 如果s.name存在,输出;不存在,输出默认值'Adam'。

  • isinstance()也可以用来判断类的类型

  • 继承实例:

    class Person(object):

        def __init__(self, name, gender):

            self.name = name

            self.gender = gender


    class Teacher(Person):

        def __init__(self, name, gender, course):

            super(Teacher,self).__init__(name,gender)

            self.course=course


首页上一页1234567下一页尾页

举报

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

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