面向对象引入
# 用所学知识实现人狗大战
person1 = {
'name': 'jason',
'atk': 100,
'lif': 100000
}
dog1 = {
'name': '沙漠死神',
'atk': 400,
'lif': 3500
}
# 人攻击狗
dog1['lif'] -= person1['atk']
# 狗攻击人
person1['lif'] -= dog1['atk']
# 如果要创建多个人或狗 代码冗余量太大 所以要封装为函数 并且攻击也可以封装成函数
def get_person(name, atk, lif):
person = {
'name': name,
'atk': atk,
'lif': lif
}
return person
def get_dog(name, atk, lif):
dog = {
'name': name,
'atk': atk,
'lif': lif
}
return dog
def person_atk(person, dog):
dog['lif'] -= person['atk']
def dog_atk(dog, person):
person['lif'] -= dog['atk']
代码优化
# 代码缺陷:人可以调用dog_atk 狗可以调用person_atk
# 优化:将功能嵌套在使用者身上
def get_person(name, atk, lif):
def person_atk(person, dog):
dog['lif'] -= person['atk']
person = {
'name': name,
'atk': atk,
'lif': lif,
'person_atk': person_atk # 将功能函数添加到字典中
}
return person
def get_dog(name, atk, lif):
def get_dog(dog, person):
person['lif'] -= dog['atk']
dog = {
'name': name,
'atk': atk,
'lif': lif,
'dog_atk': dog_atk # 将功能函数添加到字典中
}
return dog
p1 = get_person('jason', 45, 736)
d1 = get_dog('沙漠死神', 36, 872)
p1.get('person_atk')(p1, d1) # 这样人就只能调用人的攻击
引入总结
将人的数据跟人的功能绑定到一起
只有人可以调用人的功能
将狗的数据跟狗的功能绑定到一起
只有狗可以调用狗的功能
将数据与功能绑定到一起的操作起名为:'面向对象编程'
本质:将特定的数据与特定的功能绑定到一起 将来只能彼此相互使用
编程思想
面向过程思想
迄今为止 我们所编写的代码都是面向过程思想
过程:指的是流程 根据功能 一步一步的编写下来
面向对象思想
核心为 对象 二字
对象是一个 功能与数据 的结合体
一般创建了一个对象 就可以将其放在一边不管
"""
面向过程编程相当于让你给出一个问题的具体解决方案
面向对象编程相当于让你创造出一些事物之后不用你管
"""
上述两种编程思想没有优劣之分 仅仅是使用场景不同
甚至很多时候是两者混合使用
对象与类的概念
对象是 功能与数据 的结合体
而类是 多个拥有相同数据和功能的对象 的结合体
类用于产生对象
但对象才是真正的核心
对象与类的创建
先有类 再有对象
# 关键字 class
class Student:
# 学生类的公共数据
# 学生类的公共方法
"""
1.class是定义类的关键字
2.People是类的名字
类名的命名跟变量名一致 并且推荐首字母大写(为了更好的区分)
3.类体代码
公共的数据\公共的方法
ps:类体代码在类定义阶段就会执行!!!
"""
对象独有的数据
class Student:
school = '清华大学'
stu1 = Student()
# 添加独有的数据
stu1.name = 'jason'
stu1.age = 18
stu1.gender = 'male'
print(stu1.__dict__) # {'name': 'jason', 'age': 18, 'gender': 'male'}
# 要给多个学生对象添加数据 代码冗余 封装函数
def init(stu_obj, name, age, gender):
stu_obj.name = name
stu_obj.age = age
stu_obj.gender = gender
stu2 = Student()
init(stu2, 'kevin', 28, 'female')
print(stu2.__dict__) # {'name': 'kevin', 'age': 28, 'gender': 'female'}
# 当有其他类的时候 想init只给学生类用 封装到类中
class Student:
school = '清华大学'
def init(stu_obj, name, age, gender): # 这里的stu_obj变色了 发现无论怎么修改 都和其他不一样
stu_obj.name = name
stu_obj.age = age
stu_obj.gender = gender
# 在类中的函数 默认传输的第一个参数为对象本身 会自动传输
stu1 = Student()
print(stu1.__dict__) # {}
stu1.init('jason', 18, 'male')
print(stu1.__dict__) # {'name': 'jason', 'age': 18, 'gender': 'male'}
# 类提供了一种方法 __init__ 在创建类的时候自动初始化数据
class Student:
school = '清华大学'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
stu1 = Student('jason', 18, 'male') # 创建对象时就要传参
print(stu1.__dict__) # {'name': 'jason', 'age': 18, 'gender': 'male'}