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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
575人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def __str__(self):
            return '(Person: %s, %s)' % (self.name, self.gender)
    >>> p = Person('Bob', 'male')
    >>> print p
    (Person: Bob, male)

    如果要把一个类的实例变成 str,就需要实现特殊方法__str__()

    查看全部
  • 如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。

    查看全部
  • for k,v in kw.iteritems():

                setattr(self,k,v)

    **kw,本质是个dict对象,for in 通过dict的iteritems迭代器循环中会读取出key 和 value ,key是dict的key,value则是对应值。这样获取的属性设置只能通过setattr,因为你要设置的是属性的名称,而直接self.k的方式设置的属性为k,而且不是k的内容。


    查看全部
  • 有没有别的方法获取到变量更多的信息呢?

    首先可以用 type() 函数获取变量的类型,它返回一个 Type 对象。

    其次,可以用 dir() 函数获取变量的所有属性。dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() setattr( )函数了。


    查看全部
  • 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承


    查看全部
  • 多态:如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法,如果我们接收一个变量 x,则无论该 x Person、Student还是 Teacher,都可以正确打印出结果.

    sStudent类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。


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

    2020-02-27

  • 函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型。在继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法。一个实例可以看成它本身的类型,也可以看成它父类的类型。

    查看全部
  • 如果已经定义了Person类,需要定义新的StudentTeacher类时,可以直接从Person类继承:

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

    定义Student类时,只需要把额外的属性加上,例如score:

    class Student(Person):
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)
            self.score = score


    查看全部
  • 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() 把一个函数变为一个方法:

    import types
    def fn_get_grade(self):
        if self.score >= 80:
            return 'A'
        if self.score >= 60:
            return 'B'
        return 'C'
    class Person(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score
    p1 = Person('Bob', 90)
    p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
    print p1.get_grade()
    # => A
    p2 = Person('Alice', 65)
    print p2.get_grade()
    # ERROR:


    查看全部
  • 实例的方法就是在类中定义的函数

    class Person(object):
        def __init__(self, name):
            self.__name = name
        def get_name(self):
            return self.__name

    get_name(self) 就是一个实例方法,它的第一个参数是self。__init__(self, name)其实也可看做是一个特殊的实例方法.调用实例方法必须在实例上调用:

    p1 = Person('Bob')
    print p1.get_name()  # self不需要显式传入
    # => Bob


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


    查看全部
  • 类是模板,而实例则是根据类创建的对象。实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

    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
    # => Earth
    print p2.address
    # => Earth


    查看全部
  • 类是模板,而实例则是根据类创建的对象。实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

    class Person(object):
        address = 'Earth'
    print Person.address
    # => Earth
    p1 = Person('Bob')
    p2 = Person('Alice')
    print p1.address
    # => Earth
    print p2.address
    # => Earth


    查看全部
  • 如果一个属性由双下划线开头(__),该属性就无法被外部访问。如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在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'


    查看全部

举报

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

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

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