## 概述
类是封装逻辑与数据的方式
#### 类间关系
* 依赖(“uses-a”)
一个类的方法操纵另一个类的对象
* 聚合(“has-a”)
类A的对象包含类B的对象
* 继承(“is-a”)
描述特殊与一般的关系
### 面向对象编程的原则
封装(Encapsulation)
* 隐藏实现方案的细节
将**代码与数据**捆绑在一起的一种编程机制,用于保证程序和数据不受外界干扰且不会被误用。
* 继承(Inheritance)
一个对象获得另一个对象属性的过程,用于实现按层分类的概念
一个深度继承的类继承了类层次中每个祖先的所有属性
* 多态(Polymorphism)
允许一个接口被多个通用的类动作使用的特性,一个接口,多种方法,降低程序复杂性
### 类与模块的关系?
类总是位于模块中,类似模块的属性,类和模块都是命名空间
### 类属性的创建?
类属性的创建时通过把属性赋值给类对象实现的,类属性由class语句中顶层赋值语句产生的;此外任何引用类对象的地方也可以对其属性赋值,从而创建属性。
### 实例属性的创建?
实例属性是通过实例对象属性赋值来创建,实例属性一般在class语句中的方法函数中对self参数赋值属性而创建的。此外任何引用实例对象的地方也可以对其属性赋值,从而创建属性。一般来说,实例属性都是在__init__构造函数中初始化。
### self有什么意义?
self通常是类方法中的第一个参数名称,python会自动填入**实例对象**,这个对象的位置才是重点。
### 类和其他程序单元相比有什么优点?
* 多重实例
> 类是产生对象的工厂,每次调用一个类,就会产生一个拥有独立命名空间的新对象,每个对象都能读取类的属性,并在自己的命名空间中存储数据,这些数据对于每个对象来说都不同。
* 通过继承进行定制
> 子类可以继承父类,在父类的基础上加以改造,从而扩充这个类。
* 运算符重载
> 通过特定的协议方法,类可以定义对象来响应在内置类型上的几种运算。
```python
#!/usr/bin/env python
# coding: utf-8
def echo():
print 'echo'
class GoldenFish():
living_area = 'water'
__memory_time = '3 seconds'
@staticmethod
def breath():
print 'Fish is breathing.'
def __init__(self, name, gender):
self.name = name
self.__gender = gender
def eat(self, eat_what, eat_howmuch):
print self.name, 'eat', eat_howmuch, eat_what, 'in', self.living_area
def memory(self):
print 'Fish\'s memory only has %s' % self.__memory_time
def __thinkwhat(self):
print self.name, 'is think what to eat tommorrow'
def sayideas(self):
self.__thinkwhat()
print self.name, 'is', self.__gender
@property
def life_span(self):
print 'Golden fish can live for ten years'
# 先实例化一个对象fishA
fishA = GoldenFish('fishA', 'male')
# 1 静态和动态, 可以这样理解,静态的是类和对象共有的,动态的是对象私有的
# 静态字段和方法,类和对象都可以访问;动态字段和方法只有对象能访问
# 1.1 通过类访问静态字段
print GoldenFish.living_area
# 1.2 通过类访问静态方法
GoldenFish.breath()
# 1.3 类不能访问动态字段,报错
# print GoldenFish.name
# 1.4 类不能访问动态方法,报错
# GoldenFish.eat('grass', 10)
# 1.5 通过对象访问静态字段
print fishA.living_area
# 1.6 通过类访问静态方法
fishA.breath()
# 1.7 类不能访问动态字段,报错
print fishA.name
# 1.8 类不能访问动态方法,报错
fishA.eat('grass', 10)
# 2 私有和公有,这是相对于类内和类外来说的
# 私有字段和方法,只能在类内访问,公有字段和方法,类内外都可以访问
# 在类外如果必须访问私有字段和方法,有如下方法,不推荐这样的做法
fshA_GoldenFish____thinkwhat() #包括类和对象的私有方法
print fshA_GoldenFish__memory_time # 包括类和对象的私有字段
# 3 有些函数还是要定义在类外,如echo()函数
```
#### 什么时候用静态方法?
假如有一个关于操作MsSql数据库的类,使用动态方法,如果有100个业务,需要在(堆|栈)内存创建100个对象,占用空间会比较多;
```python
ms = MsSql()
ms.add(sql)
```
如果使用静态方法,直接通过类执行即可,不用创建对象,代码只在code区存储一份
> 因此,静态方法适用于实例化较多对象的场景来减少实例化所带来的内存压力。
```
MsSql.add(sql)
```
```python
class MsSql():
# 动态方法
def add(self, sql): pass
def delete(self, sql): pass
def update(self, sql): pass
def select(self, sql): pass
# 静态方法
@staticmethod
def add(sql): pass
@staticmethod
def delete(sql): pass
@staticmethod
def update(sql): pass
@staticmethod
def select(sql): pass
```
#### 什么时候使用特性property?
使用特性property模拟字段的访问方式
#### 什么时候使用私有的
不想让别人看见的或内部处理的
#### 类和字典的关系
类可以打包像字典这样的信息。
* 字典
![](http://om4h63cja.bkt.clouddn.com/17-3-14/3731443-file_1489477248006_158e6.png)
* 类
![](http://om4h63cja.bkt.clouddn.com/17-3-14/14080462-file_1489477295621_871f.png)
- 前言
- 环境搭建
- pypi
- 打包
- Python 2 和 Python 3 的版本之间差别
- 项目
- 第一部分
- 第1章 基础
- Python安装
- python代码文件类型
- python对象
- 核心数据类型
- 核心数据类型--整型和浮点型
- 核心数据类型--字符串
- str.format
- 核心数据类型--列表
- 核心数据类型--元组
- 核心数据类型--字典
- 核心数据类型--集合
- 核心数据类型--文件对象
- 调用bash
- 标准输入输出
- str-repr
- 字符编码
- 迭代器和生成器
- 第2章 语句和语法
- 赋值语句
- if语句
- while语句
- for语句
- assert
- 第3章 函数
- 函数作用域
- 工厂函数
- 内置函数
- 递归
- 嵌套作用域和lambda
- 参数传递
- 函数式编程
- property可写与可读
- 第5章 模块
- 模块导入
- 模块命名空间
- 相对导入和绝对导入
- 模块重载
- 在模块中隐藏数据
- 过渡性重载
- 第6章 类
- 面向对象还是面向过程?
- 构造函数 析构函数
- call
- 运算符重载
- str()
- 待定
- 即时生成属性
- 多态
- 线程和进程
- thread模块
- threading模块
- threading线程锁
- 糖果机
- multiprocessing
- 阻塞非阻塞同步异步
- 单线程和多线程对比
- 生产者消费者模型
- 第二部分
- 获取系统资源信息
- 获取进程所占的物理内存
- dmidecode获取系统信息
- 网络编程
- 网络基础
- python中的套接字
- socket模块
- 第三部分 高级功能
- 闭包入门
- 闭包的应用
- 装饰器入门
- 装饰器应用
- 第四部分 项目实战
- graphite
- 模块
- collections
- datetime
- Enum
- faker
- fabric
- fileinput
- fire
- fnmatch
- getpass
- glob
- hashlib
- heapq
- json模块
- log
- os
- Paramiko
- parser
- platform
- pyyaml
- Queue
- random
- re
- 特殊符号和字符
- re模块
- shelves
- subprocess
- time
- urllib_urllib2_requests
- urllib urllib2
- requests
- 标准模块ConfigParser
- 扩展模块Mysqldb
- 扩展模块dns
- 扩展模块request
- uuid
- cacheout 缓存库
- delorean 时间
- 附录
- 内置函数
- python实现各种排序算法
- 常见报错
- pymongo
- pyrocksdb
- 常用
- ERROR