面向对象微讲解

面向对象微讲解

  1. 面向对象的思想演变

点击查看推导过程
'''
假如我们想实现一个人狗大战的功能,就一个小小的功能我们来看看怎么做
'''
# 1. 先定义人和狗的技能、血量、防御,我们可以用字典来存储这些数据
# person_dict = {
#     'name': 'oscar',
#     'skill': '火焰攻击',
#     'hurt': 100,
#     'volume': 500
# }
# person1_dict = {
#     'name': 'kevin',
#     'skill': '寒冰攻击',
#     'hurt': 80,
#     'volume': 450
# }
# dog_dict = {
#     'name': '土狗',
#     'skill': '土崩',
#     'hurt': 50,
#     'volume': 300
# }
# dog1_dict = {
#     'name': '修勾',
#     'skill': '撕咬',
#     'hurt': 60,
#     'volume': 400
# }
# 角色我们只写了四个,就发现代码有些冗余了,而且还有很多重复的代码,所以我们用函数来定义一个创建角色的方法
# def person_func(name, skill, hurt, volume):
#     person_dict = {
#         'name': name,
#         'skill': skill,
#         'hurt': hurt,
#         'volume': volume
#     }
#     return person_dict
#
#
# def dog_func(name, skill, hurt, volume):
#     dog_dict = {
#         'name': name,
#         'skill': skill,
#         'hurt': hurt,
#         'volume': volume
#     }
#     return dog_dict
#
# # 创建角色
# person1 = person_func('oscar', '火焰攻击', 100, 500)
# person2 = person_func('kevin', '寒冰攻击', 80, 450)
# dog1 = dog_func('土狗','土崩',50,300)
# dog2 = dog_func('修狗','撕咬',80,400)
# # 封装一个攻击函数
# def skill_person(person,dog):
#     print('人物角色:%s 使用: %s 攻击动物角色:%s'% (person['name'],person['skill'],dog['name']))
#     dog['volume'] -= person['hurt']
#     print('攻击成功,%s受到%s点伤害,血量剩余为%s'% (dog['name'],person['hurt'],dog['volume']))
# def skill_dog(dog,person):
#     print('动物角色:%s 使用: %s 攻击人物角色:%s'% (dog['name'],dog['skill'],person['name']))
#     person['volume'] -= dog['hurt']
#     print('攻击成功,%s受到%s点伤害,血量剩余为%s'% (person['name'],dog['hurt'],person['volume']))

skill_person(person2,dog2)

skill_dog(dog1,person1)

'''
人物角色:kevin 使用: 寒冰攻击 攻击动物角色:修狗
攻击成功,修狗受到80点伤害,血量剩余为320
动物角色:土狗 使用: 土崩 攻击人物角色:oscar
攻击成功,oscar受到50点伤害,血量剩余为45
'''

我们想要的效果有了,但是呢有一些问题,我们来看

skill_dog(person1,dog1)

'''
动物角色:oscar 使用: 火焰攻击 攻击人物角色:土狗
攻击成功,土狗受到100点伤害,血量剩余为200
'''

我们发现该方法不结合实际,人可以调用狗的方法,狗可以调用人的方法,那要怎么给他们加一个限制呢我们来看

def person_func(name, skill, hurt, volume):
# 把人物的攻击方法写进创建人物角色的方法中,这样就只有人物角色才可以调用这个方法了
def skill_person(person, dog):
print('人物角色:%s 使用: %s 攻击动物角色:%s' % (person['name'], person['skill'], dog['name']))
dog['volume'] -= person['hurt']
print('攻击成功,%s受到%s点伤害,血量剩余为%s' % (dog['name'], person['hurt'], dog['volume']))
person_dict = {
'name': name,
'skill': skill,
'hurt': hurt,
'volume': volume,
'skill_person': skill_person
}
return person_dict

def dog_func(name, skill, hurt, volume):
# 把狗的攻击方法写进创建狗的方法中,这样就只有动物角色才可以调用这个方法了
def skill_dog(dog, person):
print('动物角色:%s 使用: %s 攻击人物角色:%s' % (dog['name'], dog['skill'], person['name']))
person['volume'] -= dog['hurt']
print('攻击成功,%s受到%s点伤害,血量剩余为%s' % (person['name'], dog['hurt'], person['volume']))
dog_dict = {
'name': name,
'skill': skill,
'hurt': hurt,
'volume': volume,
'skill_dog': skill_dog
}
return dog_dict

创建角色

person1 = person_func('oscar', '火焰攻击', 100, 500)
person2 = person_func('kevin', '寒冰攻击', 80, 450)
dog1 = dog_func('土狗','土崩',50,300)
dog2 = dog_func('修狗','撕咬',80,400)
person1'skill_person'
dog1'skill_dog'

以上的推导就是面向对象的思想的演变,以上的代码将人物角色、动物角色的数据与功能整合到一起的操作就是面向对象编程的思想。

  1. 编程思想

1.面向过程编程
	面向过程编程的核心就是'过程',就是将程序的执行分步操作,在分步过程中解决问题。就象我们的自行车流水线,开头
上来一个车架,放在传送带上,然后就开始装轮子,装完轮子装链条,然后就是脚踏板,然后再检验一下脚踏板的压力,然后装脚
踏板的挡板,然后就是座套,再然后就是车把,这样我们的一个自行车就完成了,就是一步一步分步操作的,中间还有很多的检查,
这样出错了就可以直接纠正,然后放在流水线上就这下一步操作。
    这个例子呢就是一步一步分步的操作,在我们IT行业这样的操作就叫面向过程编程。
2.面向对象编程
	面向对象编程的核心就是'对象','对象'其实就是一个容器,里面整合了数据和功能,满足这个条件的就是'对象'。比如
我们刚刚写的那个人狗大战的小游戏,最后把人物角色、动物角色的数据与功能整合到一起,就可以称之为面向对象编程,还比如我
们在pycharm写代码的py文件,文件里面也有功能、数据,也可以称之为面向对象编程。还比如我们人,其实就是一个对象,我们有
手有脚,就相当于数据,我们可以吃饭、跑、游泳,这就是我们的功能,当我们来跑、吃饭的时候也可以称之为面向对象编程。

面向过程编程与面向对象编程两者没有优劣之分,具体的要结合实际的业务情况,很多时候两者都是共同使用的,只是使用的比例不同。

  1. 类与对象的概念

我们刚刚已经讲过对象就是数据与功能的结合体。
我们再来讲讲类,见名知意就是种类、类别,比如我们经常说的犬类、人类、猫类等等,都属于一个类别,但是他们又各不相同,各自
有各自的特点,但是呢他们又有很多相似的点,‘比如随便来条狗我们都知道他是一条狗’。所以呢'类',就是相当于很多的个体有很多
相同的特征,这里很多个体可以是很多人,组成的就是人类,也可以是很多狗,组成就是犬类;但是在IT中呢,个体就相当于对象,特
征就相当于数据、功能,所以IT中的'类'就是很多的对象具有相同特征(数据、功能)的群体。
  1. 类与对象的创建

#我们刚刚讲过类与对象的概念,在代码的编程中是先有类再有对象的
我们来定义一个类,然后产生对象
# 定义一个学生类
class Student:
    # 学生类公共的数据
    school = '复旦大学'
    # 学生类公共的功能
    def chooes_course(self):
        print('学生选课')
'''
创建类的语法结构
class 类名:
	类体代码
'''
# 1.class是定义类的关键字
# 2.类名类似于函数名,但是首字母推荐大写
# 3.类体代码就是存放对象公共数据和功能的地方(数据:变量名 = 变量值  功能:函数)
注意:类中的子代码,就是类体代码是无需调用就会执行的,然后产生类的名称空间。

类获取数据和功能的方法:dict

print(Student.__dict__)  # 返回的是一个字典
print(Student.__dict__['school'])  # 复旦大学 获取类中的属性
print(Student.__dict__['chooes_course'])  # <function Student.chooes_course at 0x0000014DFFF7BB70> 获取类中的属性

便捷方式:局点符

print(Student.school)  # 复旦大学
print(Student.chooes_course)  # <function Student.chooes_course at 0x0000014DFFF7BB70>

类产生对象的方法

obj1 = Student()  # 类名加括号产生对象
obj2 = Student()  # 类名加括号产生对象
print(obj1.__dict__,obj2.__dict__)  # {} {}
print(obj1.school)  # 复旦大学
print(obj1.chooes_course)  # <bound method Student.chooes_course of <__main__.Student object at 0x000001F87BCDB4A8>>
Student.school = '清华大学'  # 修改类中的属性值
print(obj1.school)  # 清华大学
  1. 对象的实例化

我们用类产生对象的时候,对象是没有自己独有的属性的:

 class Student:
     school = '复旦大学'
     def chooes_course(self):
         print('学生选课')
 print(obj1.__dict__,obj2.__dict__)  # {} {} 目前对象没有自己独有的属性

我们想要对象有自己独有的属性,就要添加,也就是添加键值对:

 obj1.__dict__['name'] = 'oscar'
 obj1.__dict__['age'] = '21'
 obj2.__dict__['name'] = 'jason'
 obj2.__dict__['age'] = '18'
 也可以使用便捷方式添加
'''
obj1.name = 'oscar'
obj1.age = '21'
obj2.name = 'jason'
obj2.age = '18'
'''
 print(obj1.__dict__,obj2.__dict__)  # {'name': 'oscar', 'age': '21'} {'name': 'jason', 'age': '18'}
 print(obj1.name)  # oscar
 print(obj2.name)  # jason

我们会发现有很多冗余的代码,因为创建对象的时候可能会有很多,我们可以封装成函数:

 def init(obj,name,age):
     obj.name = name
     obj.age = age
 init(obj1,'oscar',21)
 print(obj1.name)  # oscar

但是呢简单的封装成函数没有提现出面向对象整合的精髓,所以我们将函数写到类中去:

class Student:
    def init(obj,name,age):
        obj.name = name
        obj.age = age
    school = '复旦大学'
    def chooes_course(self):
        print('学生选课')

obj1 = Student()  # 类名加括号产生对象
obj2 = Student()  # 类名加括号产生对象
Student.init(obj1,'oscar',21)
print(obj1.name)  # oscar

类中针对给对象创建独有数据的函数名,python专门定义了一个固定的方法:

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    school = '复旦大学'
    def chooes_course(self):
        print('学生选课')

obj1 = Student('oscar',21)
obj2 = Student('jason',18)
print(obj1.name)  # oscar
print(obj2.age)  # 18
'''
类中的__init__方法会在类产生对象的时候自动执行。
类创建的具体步骤:
	1.先创建一个没有独有数据的空对象
	2.将空对象和类括号内传入的数据一并交给__init__执行,__init__的第一个参数就是对象本身。
	3.将创建好的对象自动返回
'''
  1. 绑定方法

在类中定义的函数默认都是绑定给对象使用的,即对象只要来调用,就会将该对象最为第一个参数传入:

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    school = '复旦大学'
    def course(self):
        print(self)
    def chooes_course(self):
        print('%s找到我了' % self.name)
    def chooes(self):
        print('%s找到我了' % self.name)

obj1 = Student('oscar',21)
obj2 = Student('jason',18)
# 类调用类中的方法,有几个参数就需要传入几个参数
Student.course(123)  # 123
# 对象调用类中的函数,会将当前调用的对象当做第一个参数自动传入
obj1.chooes_course()  # oscar找到我了

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-04-06 21:05  陆禄绯  阅读(47)  评论(0)    收藏  举报