面向对象高级编程
来源:互联网 发布:实时数据库应用 编辑:程序博客网 时间:2024/04/29 18:59
Evernote Export
body, td {
font-family: 微软雅黑;
font-size: 10pt;
}
<div style="line-height: 1.6;">
python学习笔记
python
编程
面向对象高级编程
**使用slots
- 限制实例的属性,定义一个特殊的slots变量,示例代码如下:
1.class Student(object)
2. _slots_=('name','age')
3. #test
4. >>> s = Student() # 创建新的实例
5.>>> s.name = 'Michael' # 绑定属性'name'
6.>>> s.age = 25 # 绑定属性'age'
7.>>> s.score = 99 # 绑定属性'score'
8.Traceback (most recent call last):
9. File "<stdin>", line 1, in <module>
10.AttributeError: 'Student' object has no attribute 'score'
使用@property
- 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改成了字符或超过范围的数字;
- 为了限制
score
的范围,可以通过一个set_score()
方法来设置成绩,再通过一个get_score()
来获取成绩,这样,在set_score()
方法里,就可以检查参数,但是这样又没有直接用属性这么直接简单; - 还记得装饰器(
decorator
)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置的@property
装饰器就是负责把一个方法变成属性调用的:
1.class Student(object):
2.
3. @property
4. def score(self):
5. return self._score
6.
7. @score.setter
8. def score(self, value):
9. if not isinstance(value, int):
10. raise ValueError('score must be an integer!')
11. if value < 0 or value > 100:
12. raise ValueError('score must between 0 ~ 100!')
13. self._score = value
@property
的实现比较复杂,我们先考察如何使用。把一个getter
方法变成属性,只需要加上@property
就可以了,此时,@property
本身又创建了另一个装饰器@score.setter
,负责把一个setter
方法变成属性赋值,于是,我们就拥有一个可控的属性操作:
1.>>> s = Student()
2.>>> s.score = 60 # OK,实际转化为s.set_score(60)
3.>>> s.score # OK,实际转化为s.get_score()
4.60
5.>>> s.score = 9999
6.Traceback (most recent call last):
7. ...
8.ValueError: score must between 0 ~ 100!
1.class Student(object):
2.
3. @property
4. def birth(self):
5. return self._birth
6.
7. @birth.setter
8. def birth(self, value):
9. self._birth = value
10.
11. @property
12. def age(self):
13. return 2015 - self._birth
多重继承
- 对于需要
Runnable
功能的动物,就多继承一个Runnable
,例如Dog
:
1.class Dog(Mammal, Runnable):
2. pass
对于需要Flyable
功能的动物,就多继承一个Flyable
,例如Bat
:
1.class Bat(Mammal, Flyable):
2. pass
通过多重继承,一个子类就可以同时获得多个父类的所有功能。
- 在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称之为
MixIn
。MixIn
的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn
的功能,而不是设计多层次的复杂的继承关系。
定制类
- 定制类(难点)
使用枚举类
Enum
可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。
1.from enum import Enum
2.Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
3.for name, member in Month.__members__.items():
4. print(name, '=>', member, ',', member.value)
使用元类
- metaclass是Python中非常具有魔术性的对象,它可以改变类创建时的行为。这种强大的功能使用起来务必小心。
元类
0 0
- 面向对象高级编程
- 面向对象高级编程
- 面向对象高级编程
- python 面向对象高级编程
- 面向对象的高级编程
- Python面向对象高级编程
- python面向对象高级编程
- python 面向对象高级编程
- Python06_面向对象高级编程
- python-面向对象高级编程
- 8面向对象高级编程--->高级概念
- PHP面向对象编程 面向对象的高级实践
- python之面向对象高级编程
- Python学习----面向对象高级编程
- js面向对象编程-高级内容
- 面向对象和高级编程 20151212
- C++面向对象高级编程(上)-Geekband
- JavaScript面向对象编程高级1
- jQuery选择器总结
- simpleAdapter类
- (水)大臣的旅费 蓝桥杯 树的直径
- JavaScript模拟生成二维数组及多维数组
- 110. Balanced Binary Tree
- 面向对象高级编程
- 多个activity之间通信
- 单例模式(懒汉方式和饿汉方式)
- MVP in Android
- Hamiltonian Cycle
- Android基础-ProgressDialog用法
- 剑指offer面试题3之二维数组中的查找
- java 基数估值
- HDU-1257-最少拦截系统