25

今日内容概要

面向对象前戏

'''使用代码模拟双方打架的过程 自定义攻击力和hp(类似于宝可梦)'''
#过程一 模拟出两个东西来互打  这里使用人狗来模拟
	person1 = {'name':'xxx',
              'age':20
               'attack_val':1000,
               'HP':10000}
    dog1 = {'name':'小黄',
            'attack_val':100,
            'HP':2000}
#过程二 假设出现许多人和狗 则必须要一个一个的输入
	'''在不同地方使用相同的代码可以使用函数的方式'''
    def creat_person(name,age,attack_val,HP):
        return {'name':name,
              'age':age,
               'attack_val':attack_val,
               'HP':HP}
    def creat_gog(name,attack_val,HP):
        return {'name':'小黄',
            'attack_val':100,
            'HP':2000}
    现在在需要使用的时候直接调用函数添加即可
    p1 = creat_person('aaa',18,100,1000)
    d1 = creat_person('小黑',50,200)
    '''现在有了两边的人 就可以准备打架了 👊 '''
    定义出两边发起攻击的函数
    def person_attack(person_dict,dog_dict):
        print(f"{person_dict.get('name')}准备攻击{dog_attack.get('name')}")
        dog_dict['HP'] -= person_dict.get('attack_val')
        print(f"{dog_attack.get('name')}扣除 {person_dict.get('attack_val')} 剩余血量{dog_attack.get('HP')}")
    我们调取这个函数就可以使人攻击狗  eg: person_attack(p1,d1)
    但我们如果使用 person_attack(d1,p1) 就混乱了

面向对象核心思路前戏

'''续上 为了避开混乱的情况 我们可以限定人攻击的函数只有人才可以调用'''
#推导过程三 
	将攻击函数放到创造人的函数中 就可以做到
    def creat_person(name,age,attack_val,HP):
        def person_attack(person_dict,dog_dict):
        print(f"{person_dict.get('name')}准备攻击{dog_attack.get('name')}")
        dog_dict['HP'] -= person_dict.get('attack_val')
        print(f"{dog_attack.get('name')}扣除 {person_dict.get('attack_val')} 剩余血量{dog_attack.get('HP')}")
        return {'name':name,
              'age':age,
               'attack_val':attack_val,
               'HP':HP}
    使用:
    	p1 = creat_person('xxx',18,10,1000)
        p1.get('person_attack')(p1,d1)

'''面向对象的核心思想:数据与功能的绑定'''

编程思想

#1.面向过程编程
	过程就是流程 面向过程就是按照固定的流程解决问题
    eg:之前所学的 几乎都是过程编程
    注册功能 登录功能 转账功能
    需要列举出每一步的流程 并且随着步骤的深入 问题解决的越简单
    
    
#2.面向对象编程
	对象就是容器 数据与功能的结合体 (在python中万物皆对象)
   	 例如MOBA游戏中的角色 我们负责创造 而在游戏中的表现是我们无法控制的

  
'''
上面的两种关系并不是对立的
没有优劣之分 结合实际需求使用
两种编程思想融会贯通 只不过在不同的地方占比不同
'''

面向对象之类与对象

对象:数据与功能的结合体
类:多个对象相同数据和相同功能的结合体
'''
有点绕 我们可以这么理解:
	每一个人都是不一样的 但我们都是人类 所以在我们去定义是不是人类的时候就会拿出人类的相同的特质
'''
#在我们实际生活中肯定是先有个体再有群体
#但是在程序中如果想要产生对象 必须要先定义类(反着记)

类与对象的创建

面向对象并不是一门新的技术 但是为了区分开 针对面向对象设计了专门的语法结构
python中一定要先定义类 才能创建对象

#类的语法结构
	class 类名:
        '''代码注解'''
        对象的公共数据
        对象的公共功能
    1.class是定义类的关键字
    2.类名与变量名的命名几乎一致 需要区分的是类名的首字母要是大写(方便区分)
    3.数据:变量名与数据值的绑定 功能(方法)其实就是函数
#类的使用和调用
	类在定义阶段就会执行类体代码 但是属于类的局部名称空间 外界无法直接使用
    '''需求:清华大学的选课系统'''
    class Student:
        #对象的公共数据
        school_name = '清华大学'
        
        #对象的公共功能
        def choice_course(self):
            print('学生的选课系统')
#查看名称空间
	print(Student.__dict__) '''将此名称空间的变量名以字典的形式展示'''
    print(Student.__dict__.get('school_name'))
    对于名称空间中的变量名我们可以使用句点式来调用变量名
    print(Student.school_name)
#类的调用>>>产生对象
'''类名加括号就会产生对象 并且每一次的执行都会产生一个全新的对象'''
obj1 = Student()
obj2 = Student()
print(obj1,obj2) 获得的是两个不一样的地址
print(obj1.__dict__) 此时里面为空
print(obj1.school_name) # 清华大学
#如果想要修改名称空间变量名所绑定的值
Student.school_name = '家里蹲大学'
print(obj1.school_name) # 家里蹲大学
'''数据和功能  可以统称为属性    数据>>>属性名   功能>>>方法'''

对象独有的数据

class Student:
    # 对象的公共数据
    school_name = '清华大学'
    
    # 对象公共的功能
    def choice_course(self):
        print('学生选课系统')
     
 obj1 = Student()
 obj2 = Student()
'''推导过程一 每个对象手动添加独有的数据'''
 obj1.__dict__['name'] = 'xiapchen'
 obj1.__dict__['age'] = 18
 obj1.__dict__['hobby'] = 'play'
 obj2.__dict__['name'] = 'sss'
 obj2.__dict__['age'] = 19
 obj2.__dict__['hobby'] = 'read'
'''推导过程二 假设有许多的人 我们可以把这个封装成函数'''
def init(obj,name,age,hobby)
	obj.__dict__['name'] = name
	obj.__dict__['age'] = age
	obj.__dict__['hobby'] = hobby
    
 stu1 = Student()
 stu2 = Student()
 init(stu1,'xiaochen',19,'play')
 init(stu2,'xxx',18,'read')
'''推导过程三 此功能只有学生有资格调用'''
class Student:
    # 对象的公共数据
    school_name = '清华大学'
    
    #学生特有的功能
    def init(obj,name,age,hobby)
	obj.__dict__['name'] = name
	obj.__dict__['age'] = age
	obj.__dict__['hobby'] = hobby
    
    # 对象公共的功能
    def choice_course(self):
        print('学生选课系统')
        
 stu1 = Student()
 Student.init(stu1, 'jason', 18, 'music')
 stu2 = Student()
 Student.init(stu2, 'kevin', 29, 'read')
 print(stu1.__dict__, stu2.__dict__)
'''推导过程四 对init进行变形处理'''
class Student:
     # 对象公共的数据
     school_name = '清华大学'

    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
     def __init__(obj, name, age, hobby):
         obj.__dict__['name'] = name
         obj.__dict__['age'] = age
         obj.__dict__['hobby'] = hobby

     # 对象公共的功能
     def choice_course(self):
         print('学生选课功能')

 stu1 = Student('jason', 18, 'read')  # 在类中默认将空对象作为第一个参数传入
 print(stu1.__dict__)
 print(stu1.name)
 print(stu1.school_name)
'''推导过程五 变量名修改'''
class Student:
    # 对象公共的数据
    school_name = '清华大学'

    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
    def __init__(self, name, age, hobby):
        self.name = name  # self.__dict__['name'] = name
        self.age = age
        self.hobby = hobby

    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')

stu1 = Student('jason', 18, 'read')
print(stu1.name)
print(stu1.school_name)

对象独有的功能

class Student:
    # 对象公共的数据
    school_name = '清华大学'

    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
    def __init__(self, name, age, hobby):
        self.name = name  # self.__dict__['name'] = name
        self.age = age
        self.hobby = hobby

    # 对象公共的功能
    def choice_course(self):
        print(f'学生{self.name}正在选课')
        
stu1 = Student('xiaochen', 18, 'music')
stu2 = Student('kevin', 28, 'read')
# 1.直接在全局定义功能  该函数就不是学生对象独有的了
# def eat():
#     print('吃东西')
# stu1.eat = eat
# print(stu1.__dict__)
# stu1.eat()
# 2.只能将函数放在类中 但是类中的函数又是对象公共的
'''定义在类中的功能 默认就是绑定给对象使用的 谁来调谁就是主人公'''
# Student.choice_course(123)  # 类调用需要自己传参数
# stu1.choice_course()  #  choice_course(stu1)  对象调用会自动将对象当做第一个参数传入

# stu1.choice_course()
# stu2.choice_course()

# 对象修改数据值
stu1.name = 'tony'  # 当点的名字已经存在的情况下 则修改对应的值
# 对象新增数据值
stu1.pwd = 123  # 当点的名字不存在的情况下 则新增数据
print(stu1.__dict__)
posted @ 2022-11-02 17:18  早点早点灬  阅读(105)  评论(0)    收藏  举报