[TOC]
对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体。
### 定义类
* 在现实世界中,先有对象,再有类
* 在程序中,先定义(类),后使用类(用来产生对象)
在Python中程序中的类用class关键字定义,而在程序中特征用变量标识,技能用函数标识,因而类中最常见的无非是:变量和函数的定义
```
class student():
school='CECT'
def learn(self):
print('is learning')
def eat(self):
print('is eating')
def sleep(self):
print('is sleeping')
```
注意:
* 类中可以有任意python代码,这些代码在类定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过`student.__dict__`查看
* 类中定义的名字,都是类的属性,点是访问属性的语法。
### 直接操作类的属性
```
student.school #查
student.school='qh' #改
student.name=1 #增
del student.name #删
```
### 类实例化为对象
```
s1=student()
s2=student()
s3=student()
```
> 如此,实例化了三个对象s1、s2、s3,但现在这三者除属性相同,如果想让他们还有不同的熟悉,就要用到`__init__`来初始化
### `__init__`初始化
注意:该方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但一定不能有返回值
```
class student():
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
......
s1=student('noah',28,'男')
print(s1.name,s1.age,s1.sex)
#结果:
noah 28 男
```
>也可以先调用类产生空对象s1,然后用`student.__init__(s1,'李坦克','男',18)`初始化
### 对象的使用
```
s1.name #查,等同于s1.__dict__['name']
s1.name='王三炮' #改,等同于s1.__dict__['name']='王三炮'
s1.course='python' #增,等同于s1.__dict__['course']='python'
del s1.course #删,等同于s1.__dict__.pop('course')
```
### 类的属性
类有两种属性:数据属性和函数属性
1、类的数据属性是所有对象共享的
~~~
#类的数据属性是所有对象共享的,id都一样
print(id(student.school))
print(id(s1.school)) #4377347328
print(id(s2.school)) #4377347328
print(id(s3.school)) #4377347328
~~~
2、类的函数数据是绑定给对象用的,称为绑定到对象的方法
~~~
#类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
print(student.learn) #<function student.learn at 0x1021329d8>
print(s1.learn) #<bound method student.learn of <__main__.studentobject at 0x1021466d8>>
print(s2.learn) #<bound method student.learn of <__main__.studentobject at 0x102146710>>
print(s3.learn) #<bound method student.learn of <__main__.studentobject at 0x102146748>>
#ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准
~~~
### 属性查找顺序
属性查找顺序:先在对象自己的名称空间找,然后到类中找,再然后到父类中找,直到都找不到而抛出异常
注意下面的案例,属性查找并不是就近原则,而是一定先从对象的名称空间开始
```
class Foo:
def f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2')
self.f1()
class Bar(Foo):
def f1(self):
print('Bar.f1')
b=Bar()
b.f2()
# 打印结果:
Foo.f2
Bar.f1
```
### 绑定方法
类中定义的函数,主要是给对象使用的,是绑定到对象的.
~~~
class student:
school='CECT'
def __init__(self,name,sex,age):
self.name=name
self.age=age
self.sex=sex
def learn(self):
print('%s is learning' %self.name) #新增self.name
def eat(self):
print('%s is eating' %self.name)
def sleep(self):
print('%s is sleeping' %self.name)
s1=student('李坦克','男',18)
s2=student('王大炮','女',38)
s3=student('牛榴弹','男',78)
~~~
类中定义的函数是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
~~~
student.learn(s1) #李坦克 is learning
student.learn(s2) #王大炮 is learning
student.learn(s3) #牛榴弹 is learning
~~~
强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法`__init__`也是一样的道理)
~~~
s1.learn() #等同于student.learn(s1)
s2.learn() #等同于student.learn(s2)
s3.learn() #等同于student.learn(s3)
~~~
**注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。**
- 基础部分
- 基础知识
- 变量
- 数据类型
- 数字与布尔详解
- 列表详解list
- 字符串详解str
- 元组详解tup
- 字典详解dict
- 集合详解set
- 运算符
- 流程控制与循环
- 字符编码
- 编的小程序
- 三级菜单
- 斐波那契数列
- 汉诺塔
- 文件操作
- 函数相关
- 函数基础知识
- 函数进阶知识
- lambda与map-filter-reduce
- 装饰器知识
- 生成器和迭代器
- 琢磨的小技巧
- 通过operator函数将字符串转换回运算符
- 目录规范
- 异常处理
- 常用模块
- 模块和包相关概念
- 绝对导入&相对导入
- pip使用第三方源
- time&datetime模块
- random随机数模块
- os 系统交互模块
- sys系统模块
- shutil复制&打包模块
- json&pickle&shelve模块
- xml序列化模块
- configparser配置模块
- hashlib哈希模块
- subprocess命令模块
- 日志logging模块基础
- 日志logging模块进阶
- 日志重复输出问题
- re正则表达式模块
- struct字节处理模块
- abc抽象类与多态模块
- requests与urllib网络访问模块
- 参数控制模块1-optparse-过时
- 参数控制模块2-argparse
- pymysql数据库模块
- requests网络请求模块
- 面向对象
- 面向对象相关概念
- 类与对象基础操作
- 继承-派生和组合
- 抽象类与接口
- 多态与鸭子类型
- 封装-隐藏与扩展性
- 绑定方法与非绑定方法
- 反射-字符串映射属性
- 类相关内置方法
- 元类自定义及单例模式
- 面向对象的软件开发
- 网络-并发编程
- 网络编程SOCKET
- socket简介和入门
- socket代码实例
- 粘包及粘包解决办法
- 基于UDP协议的socket
- 文件传输程序实战
- socketserver并发模块
- 多进程multiprocessing模块
- 进程理论知识
- 多进程与守护进程
- 锁-信号量-事件
- 队列与生产消费模型
- 进程池Pool
- 多线程threading模块
- 进程理论和GIL锁
- 死锁与递归锁
- 多线程与守护线程
- 定时器-条件-队列
- 线程池与进程池(新方法)
- 协程与IO模型
- 协程理论知识
- gevent与greenlet模块
- 5种网络IO模型
- 非阻塞与多路复用IO实现
- 带着目标学python
- Pycharm基本使用
- 爬虫
- 案例-爬mzitu美女
- 案例-爬小说
- beautifulsoup解析模块
- etree中的xpath解析模块
- 反爬对抗-普通验证码
- 反爬对抗-session登录
- 反爬对抗-代理池
- 爬虫技巧-线程池
- 爬虫对抗-图片懒加载
- selenium浏览器模拟