Py003-01-01面向对象

编程范式

  • 面向过程(国民党的路线,一直在一次一次的解决问题,氪金,高级装备,最后败走台湾)
  • 面向对象(我党的路线,一直在建立统一思想,思想就是种信仰,为信仰而奋斗,从军人员的壮大,7月建党8月建军10月建国。你懂的)
1
2
3
4
生活实例: 从北京到上海
面向过程: 学驾照,买车,摇号,冲油,油门,百度地图,上海(你必须考证,买车,挂牌,会看地图)

面向对象: 找大巴车,火车,高铁,飞机 (你需要会开车吗?)

提到面向对象就不得不说的——类

  • 同类事物的抽象描述——类

类的定义和实例化对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 学生对象
# 001先定义类
class Student:
school = '清华'

def learn(self):
print('学习啦')

def eat(self):
print('吃饭啦')

def sleep(self):
print('睡觉啦')

# 最后产生对象
student_a = Student()

使用类

相关属性的增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 在类定义后 内部的代码就会执行 生成对应的名字空间(dict)
class Student:
# 数据属性
school = 'xx大学'
# 函数属性
def learn(self):
print('is learning')

print('=====running=====') # 会被执行


# 查看类的名字空间
print(Student.__dict__)
print(Student.__dict__['school'])
print(Student.__dict__['learn'])

# 查
print(Student.school)
print(Student.learn)

# 增 可以动态添加(如下);也可以在定义的时候添加属性如 school属性
Student.county = 'China'
print(Student.__dict__)
print(Student.county)

# 删
del Student.county

# 改
Student.school = '清华池'

如何使用对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# __init__方法用来为对象定制自己独有的特征

class Student:
# 数据属性
school = 'xx大学'

# __init__
def __init__(self,name,sex,age):
self.Name = name
self.Sex = sex
self.Age = age

# 函数属性
def learn(self):
print('is learning')

# 此时创建对象的时候 就不能直接 Student()了而是如下:
stu = Student('张三','男',18)

'''
__init__是你实例化的时候调用
1. 产生一个空对象 tmp
2. Student.__init__(tmp,'张三','男',18)
tmp.Name = '张三'
tmp.Sex = '男'
tmp.Age = 18
3. 返回tmp的地址给 stu
'''

对象属性的CRUD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查
stu = Student('张三','男',18)
print(stu.__dict__)
print(stu.Name)
print(stu.Age)

# 改
stu.Name = '李四'

# 删
del stu.Name

# 增
stu.className = '前端部'

属性查找和绑定方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Student:
school = 'xx大学'

def __init__(self,name,sex,age):
self.Name = name
self.Sex = sex
self.Age = age

def learn(self):
print('%sis learning'%self.Name)

# 后产生对象
stu1 = Student('张三','男',11)
stu2 = Student('李四','男',22)
stu3 = Student('王五','男',33)

# 对象:特征和技能的结合体
# 类一系列对象相似的特征和相似的技能的结合体


# 类中的数据属性:是所有对象共有的
print(Student.school,id(Student.school))
print(stu1.school,id(stu1.school))
print(stu2.school,id(stu2.school))
print(stu3.school,id(stu3.school))

'''
# 它们的id值都一样
xx大学 2644686064016
xx大学 2644686064016
xx大学 2644686064016
xx大学 2644686064016
'''

#----------------------------------------------------------
# 类中的函数属性:是绑定给对象使用的,绑定到不同的对象是不同的绑定方法,对象调用绑定方法时,把对象本身当作第一个参数传入也就是self
print(Student.learn)
print(stu1.learn)
print(stu2.learn)
print(stu3.learn)

'''
# 它们的learn方法 地址都不一样
<function Student.learn at 0x00000271C5AFAEA0>
<bound method Student.learn of <__main__.Student object at 0x00000271C5B045C0>>
<bound method Student.learn of <__main__.Student object at 0x00000271C5B04710>>
<bound method Student.learn of <__main__.Student object at 0x00000271C5B04748>>
'''

# Student.learn() 报错 因为默认有个self参数 没有传递 learn() missing 1 required positional argument: 'self'
Student.learn(123) # 继续报错
Student.learn(stu1) # 张三is learning
Student.learn(stu2) # 李四is learning
Student.learn(stu3) # 王五is learning

# 起始你可以这样调用
stu1.learn() # 张三is learning
stu2.learn() # 李四is learning
stu3.learn() # 王五is learning

类中的数据属性:

  • 是所有对象共有的

类中的函数属性:

  • 是绑定给对象使用的
  • 绑定到不同的对象是不同的绑定方法
  • 对象调用绑定方法时,把对象本身当作第一个参数传入也就是self

属性查找

  • 先从实例对象上找,没有去类找,在没有就报错
1
2
3
4
5
6
7
8
9
10
stu1.x = 'from stu1'
Student.x = 'from Student class'
print(stu1.x) # 从自身找 'from stu1'

# 如果对象stu1自身没有y属性 则从Student找
# stu1.y = 'from stu1'
Student.y = 'from Student class'
print(stu1.y) # 从Student找 'from Student class'

# 如果Student也没有 报错

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'''
编写学生类,产生一堆学生对象
要求:
有一个计数器(属性),统计共实例了多少个对象
'''
class Student:
school = 'xx大学'
count = 0
def __init__(self,name,sex,age):
self.Name = name
self.Sex = sex
self.Age = age
Student.count+=1

def learn(self):
print('%sis learning'%self.Name)


s1 = Student('a1','nan',11)
s2 = Student('a2','nan',11)
s3 = Student('a3','nan',11)
print(Student.count)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'''
模拟王者荣耀定义两个英雄
要求:
英雄要有攻击力,生命,名字
实例化两个英雄对象
英雄之间可以互相殴打,被殴打一方掉血,血量少于0则判断死亡
'''

class Hero:
def __init__(self,name,life_value,aggresivity):
self.name = name
self.life_value = life_value
self.aggresivity = aggresivity

def attack(self,enemy):
enemy.life_value -= self.aggresivity

a = Hero('亚瑟',100,50)
b = Hero('小乔',100,60)

a.attack(b)