[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) #
print(s1.learn) #>
print(s2.learn) #>
print(s3.learn) #>
#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。**