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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
  • 任务 假设Person类通过__slots__定义了name和gender,请在派生类Student中通过__slots__继续添加score的定义,使Student类可以实现name、gender和score 3个属性。 ?不会了怎么办 Student类的__slots__只需要包含Person类不包含的score属性即可。 参考代码: class Person(object): __slots__ = ('name', 'gender') def __init__(self, name, gender): self.name = name self.gender = gender class Student(Person): __slots__ = ('score',) def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score s = Student('Bob', 'male', 59) s.name = 'Tim' s.score = 99 print s.score
    查看全部
    0 采集 收起 来源:python中 __slots__

    2016-12-12

  • 由于Python是动态语言,任何实例在运行期都可以动态地添加属性。 如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利用Python的一个特殊的__slots__来实现。 顾名思义,__slots__是指一个类允许的属性列表。 __slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。
    查看全部
    0 采集 收起 来源:python中 __slots__

    2016-12-12

  • 考察 Student 类: 当我们想要修改一个 Student 的 score 属性时,可以这么写: s = Student('Bob', 59) s.score = 60 但是也可以这么写: s.score = 1000 显然,直接给属性赋值无法检查分数的有效性。 如果利用两个方法: 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.set_score(1000) 就会报错。这种使用 get/set 方法来封装对一个属性的访问在许多面向对象编程的语言中都很常见。但是写 s.get_score() 和 s.set_score() 没有直接写 s.score 来得直接。 有没有两全其美的方法?----有。 因为Python支持高阶函数,在函数式编程中我们介绍了装饰器函数,可以用装饰器函数把 get/set 方法“装饰”成属性调用: @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 注意: 第一个score(self)是get方法,用@property装饰,第二个score(self, score)是set方法,用@score.setter装饰,@score.setter是前一个@property装饰后的副产品。 现在,就可以像使用属性一样设置score了: 说明对 score 赋值实际调用的是 set方法。 用 @property 修饰 grade 的 get 方法即可实现只读属性。
    查看全部
    0 采集 收起 来源:python中 @property

    2018-03-22

  • Rational类实现了有理数运算,但是,如果要把结果转为 int 或 float 怎么办? 如果要把 Rational 转为 int,应该使用: r = Rational(12, 5) n = int(r) 要让int()函数正常工作,只需要实现特殊方法__int__(): class Rational(object): def __init__(self, p, q): self.p = p self.q = q def __int__(self): return self.p // self.q 结果如下: >>> print int(Rational(7, 2)) 3 >>> print int(Rational(1, 3)) 0 同理,要让float()函数正常工作,只需要实现特殊方法__float__()。 将self.p转型为float类型,再作除法就可以得到float: float(self.p) / self.q
    查看全部
  • Python 提供的基本数据类型 int、float 可以做整数和浮点的四则运算以及乘方等运算。 但是,四则运算不局限于int和float,还可以是有理数、矩阵等。 要表示有理数,可以用一个Rational类来表示:p、q 都是整数,表示有理数 p/q。 class Rational(object): def __init__(self, p, q): self.p = p self.q = q class Rational(object): def __init__(self, p, q): self.p = p self.q = q 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 任务 Rational类虽然可以做加法,但无法做减法、乘方和除法,请继续完善Rational类,实现四则运算。 提示: 减法运算:__sub__ 乘法运算:__mul__ 除法运算:__div__ ?不会了怎么办 如果运算结果是 6/8,在显示的时候需要归约到最简形式3/4。 【欧几里德算法又称辗转相除法, 用于计算两个整数a, b的最大公约数。其计算原理依赖于下面的定理: 定理: gcd(a, b) = gcd(b, a mod b)】
    查看全部
  • 如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数。 要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。 只要正确实现了__len__()方法,就可以用len()函数返回实例的“长度”。 斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。 需要根据num计算出斐波那契数列的前N个元素。 疑问:代码中num与numbers的区别?
    查看全部
    0 采集 收起 来源:python中 __len__

    2016-12-12

  • 对 int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序,但是,如果对一组 Student 类的实例排序时,就必须提供我们自己的特殊方法 __cmp__(); __cmp__()方法,根据排序位置前、并列、后,可分别返回值-1、0、1。
    查看全部
    0 采集 收起 来源:python中 __cmp__

    2016-12-12

  • 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(); 因为 Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。 有一个偷懒的定义__repr__的方法: __repr__ = __str__
    查看全部
  • 可以用 type() 函数获取变量的类型,它返回一个 Type 对象; 可以用 dir() 函数获取变量的所有属性,dir()返回所有实例属性:包括`__class__`这类有特殊意义的属性,注意到方法`whoAmI`也是 s 的一个属性; 【如何去掉`__xxx__`这类的特殊属性,只保留我们自己定义的属性?回顾一下filter()函数的用法。】 dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了。
    查看全部
  • 传入**kw 即可传入任意数量的参数,并通过 setattr() 绑定属性。
    查看全部
  • 添加任意for k, v in kw.iteritems(): setattr(self, k, v)
    查看全部
  • 想要获取对象的信息有很多种方式: 1、type() 函数获取变量的类型,返回一个 Type 对象。 2、用 dir() 函数获取变量的所有属性。 3、dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了 getattr(s, 'name') # 获取name属性 setattr(s, 'name', 'Adam') # 设置新的name属性 getattr(s, 'age') # 获取age属性,但是属性不存在,报错: getattr(s, 'age', 20) # 获取age属性,如果属性不存在,就返回默认值20
    查看全部
  • 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。 多重继承的继承链就不是一棵树了, 多重继承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次: 多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。 多重继承需要从两个或更多的类派生。
    查看全部
  • Python提供了open()函数来打开一个磁盘文件,并返回 File 对象。File对象有一个read()方法可以读取文件内容: 例如,从文件读取内容并解析为JSON结果: import json f = open('/path/to/file.json', 'r') print json.load(f) 由于Python的动态特性,json.load()并不一定要从一个File对象读取内容。任何对象,只要有read()方法,就称为File-like Object,都可以传给json.load()。 请尝试编写一个File-like Object,把一个字符串 r'["Tim", "Bob", "Alice"]'包装成 File-like Object 并由 json.load() 解析。 不会了怎么办 只要为Students类加上 read()方法,就变成了一个File-like Object。 参考代码: import json class Students(object): def read(self): return r'["Tim", "Bob", "Alice"]' s = Students() print json.load(s)
    查看全部
    0 采集 收起 来源:python中多态

    2018-03-22

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

举报

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

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