名词解释
对象 Object 包括attr和method
类 Class obj的集合
---- ----------------
封装 Encapsulation 隐藏obj的细节
继承 Inheritance 普通的class为基础,创建专门的subclass
---- ----------------
多态 Polymorphism 对不同obj使用相同的Method Poly-多
方法 Method 绑定到obj Attr上的函数
特性 Attribute obj的变量
---- ----------------
子类 Subclass 一个class是另一个class的子集
超类 Superclass 一个class是另一个class的超集
构造函数 不在此说明
duck typing: 如果他像鸭子一样呱呱大叫,那他就是鸭子
- object的state由他的Attribute(变量)来描述
- object的Method(函数)可以改变他的Attr(变量)
类和类型
- 一般对话使用复数名词来描述class - 如,birds
- Python习惯使用单数名词,并且首字母大写 - 如,Bird
- C++也是单数名词,并且首字母大写
- mint在C++语言中更习惯再加前缀C - 如,CBird
类
e.g. 通常类的创建:
class 类名:
attr1 = 0
attr2 = []
def Method1(self):
print(self.attr1)
def Method2(self, params):
self.attr2[i] = params
e.g. 通常类的继承:
class 类名(superclass1, superclass2, ...):
self
类似C++中的隐式参数this
指针- c++是隐式的,不用写出来
self参数正是方法和函数的区别
新式类的声明:
__metaclass__ = type # use new type
python为了让方法或者特性变为私有private,在他名前面加上双下划线
即可
但python的私有化是假的,还是可以访问的到
而c++是使用编译器的关键字private
此外,名字带有下划线
的不会被form module import *
的方式引用
一些面向对象的设计
- 将属于一类的obj放一起
- 不要让obj过于亲密,Method只关心自己obj的attr
- 小心继承,尤其是多重继承
- 简单就好,Method单一原则
如何创建类:
- 写下问题的描述
- 名字做类名
- 动词作方法
- 形容词作特性
- 把方法和特性分配到类
如何精炼模型:
- 写下一系列的实例,试着包括所有功能
- 考虑和测试每个实例,少的补,错的改
接口和内省
getattr(obj, name[, default]) 返回attr
hasattr(obj, name) 是否有此attr,返回bool值
setattr(obj, name, value) 给obj创建obj并赋值
isinstance(obj, class) obj是否是class的实例
issubclass(A,B) A是否是B的subclass
type(obj) 返回对象类型
其他函数
random.choice(seq) 从非空序列中随机选择元素