初始面向对象

今日内容概要

  • 面向对象前戏之人狗大战
  • 面向对象编程思想
  • 面向对象重要理论
  • 面向对象代码实操
  • 对象的独有数据
  • 对象的独有方法

今日内容详细

人狗大战

# # 设置人的基础数据
# person_dict = {
#     "name": "jason",
#     "gender": "mal",
#     "p_type": "猛男",
#     "attack_val": 8000,
#     "life_val": 90000
# }
#
# # 设置狗的基础数据
# dog_dict = {
#     "name": "小黑",
#     "d_type": "泰迪",
#     "attack_val": 23,
#     "life_val": 80000
# }
#
#
# # 设置攻击人为攻击方
# def p_attack_d(person, dog):
#     dog["life_val"] -= person["attack_val"]
#     print(f"{person['name']} 打狗 {dog['name']} 了")
#     print(f"{dog['name']} 减少{person['attack_val']} 剩余{dog['life_val']}")
#
#
# # 设置 狗攻击人
# def d_attack_p(dog, person):
#     person["life_val"] -= dog["attack_val"]
#     print(f"{dog['name']} 咬人 {person['name']} 了")
#     print(f"{person['name']} 减少{dog['attack_val']} 剩余{person['life_val']}")
#
#
# p_attack_d(person_dict, dog_dict)
# d_attack_p(dog_dict, person_dict)

我们发现 现在人写死 而且 现在的 两个攻击机制不管 那个角色去调用都可以
我现在的要求 人不能写死 而且 人攻击的手段只有人才能调用  狗攻击的手段只有狗才能调用


"""
如何才能实现 我的要求 那就把 人攻击的手段 封装到 人的字典里面
也就是把这个方法绑定给人  只有人才能调用
狗也一样 把 那个方法封装给狗 只有狗才能调用

数据与功能绑定
"""


def person(name, gender, p_type, attack_val, life_val, ):
    def p_attack_d(dog):
        dog["life_val"] -= person_dict["attack_val"]
        print(f"{person_dict['name']} 打狗 {dog['name']} 了")
        print(f"{dog['name']} 减少{person_dict['attack_val']} 剩余{dog['life_val']}")

    person_dict = {
        "name": name,
        "gender": gender,
        "p_type": p_type,
        "attack_val": attack_val,
        "life_val": life_val,
        "p_attack_d": p_attack_d
    }
    return person_dict


def dog(name, d_type, attack_val, life_val):
    def d_attack_p(person):
        person["life_val"] -= dog_dict["attack_val"]
        print(f"{dog_dict['name']} 咬人 {person['name']} 了")
        print(f"{person['name']} 减少{dog_dict['attack_val']} 剩余{person['life_val']}")

    dog_dict = {
        "name": name,
        "d_type": d_type,
        "attack_val": attack_val,
        "life_val": life_val,
        "d_attack_p": d_attack_p,
    }
    return dog_dict


p1 = person("jason", "male", "猛男", 8000, 90000)
d1 = dog("小黑", "泰迪", 23, 80000)
p1["p_attack_d"](d1)
d1["d_attack_p"](p1)

编程思想

  1. 面向过程编程

    过程及流程 如流水账一般 做一件事先干啥后干啥,固定套路

    eg: ATM 使用的几乎都是面向过程编程,注册,登录,转账

    需要例举出每一步的流程 并且随着步骤的深入问题的解决越来越简单

    ps:提出问题 然后指定出该问题的解决方案

  2. 面向对象编程

    对象及容器 数据与功能的集合体(python中一切皆对象)

    eg:游戏人物

    ​ 亚索 劫 盲僧

    那些 数据(攻击范围 基础血量 基础攻击 基础 防御等)
    

    ​ 功能( 技能 Q W E R)

    面向对象编程有点类似于造物主的感觉 我们只需要造出一个个对象

    至于该对象将来会如何发展跟程序员没有关系也无法控制

总结

​ 上述两种思想没有优劣之分 需要结合实际需求而定

​ 如果需要是注册 登录 人脸识别肯定面向过程更合适

​ 如果需求是游戏人物肯定是面向对象更合适

​ 实际编程两种思想是彼此交融的 只不过占比不i同

面向对象之 类与对象

对象:数据与功能的结合体             对象才是核心
类: 多个对象相同数据和功能的结合体      类主要就是为零节省代码
"""
一个人                    对象
一群人                    人类(所有人都相同的属性名和方法)

一条狗                   对象
一群人                   犬类(所有狗相同的属性名和方法)
"""

现实中一般是现有对象再有类

程序中如果想要产生对象 必须要先定义出类

类与对象的创造

面向对象并不是一门新的技术 但是为了很好的一眼区分开 针对面向对象设计了新的语法格式

python中一定要有类 才能借助类产生对象

1.类的语法结构
class 类名:
    """代码注释(说明一下这个类是干嘛的)"""
    对象的公共数据
    对象的公共方法
1.1 class 是定义的关键字
1.2 类名的命名与变量名几乎一致 需要注意的是 类名的首字母大写
   推荐大写 便于区分 让别人一看就知道这是个类
1.3 数据: 变量名与数据值的绑定 功能(方法)其实就是函数
    
2.类定义与调用
	类在定义阶段就会执行类体代码 但是属于类的局部名称空间 外界无	    法直接调用   

1.类的定义 和 查看类的名称空间

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

    对象公共的功能
    def choice_course(self):
        print("学生选课系统")

查看名称空间
# print(Student.__dict__)

前面那些先不管 先看我们能看懂的 我门定义的school_namechoice_course都在里面

  1. 在面向对象中 类和对象 访问数据和方法 可以统一采用句点符

    """ 在面向对象中  类和对象  访问数据和方法 可以统一采用句点符"""
    print(Student.school_name)
    print(Student.choice_course)
    

  2. 类的每次调用都会产生新的对象

    # 类的调用 》》》 产生对象
    # 类名加括号就会产生对象 并且每执行一次队徽产生一个全新的对象
    obj1 = Student()
    obj2 = Student()
    obj3 = Student()
    print(obj1)
    print(obj2)
    print(obj3)
    

    # 看一眼现在的对象的名称空间
    print(obj1.__dict__)
    print(obj2.__dict__)
    print(obj3.__dict__)
    

    三个现在全部为空,这里的名称空间是这些对象的一些独有的的数据和方法,现在他们一个都没有所以为空

  3. 给对象添加独有功能

    class Student:
        # 对象的公共数据
        school_name = "清华大学"
    
        # 对象公共的功能
        def choice_course(self):
            print("学生选课系统")
    
    obj1 = Student()
    obj2 = Student()
    obj3 = Student()
    # 添加功能 对象的特点 原本有这个数据则修改 没有这个数据的则添加(跟字典挺像的)
    obj1.name = "jason"
    obj2.name = "kevin"
    obj3.name = "oscar"
    print(obj1.__dict__)
    print(obj2.__dict__)
    print(obj3.__dict__)
    
    

    太麻烦的封装成函数

    class Student:
        # 对象的公共数据
        school_name = "清华大学"
    
        # 对象公共的功能
        def choice_course(self):
            print("学生选课系统")
    
    def init(obj, name):
        obj.name = name
    
    obj1 = Student()
    obj2 = Student()
    obj3 = Student()
    
    init(obj1, "jason")
    init(obj2, "kevin")
    init(obj3, "oscar")
    print(obj1.__dict__)
    print(obj2.__dict__)
    print(obj3.__dict__)
    

  4. 怎么把这个init封装成独有属性呢,python解释器就已经帮你搞了

    class Student:
        school_name = "清华大学"
    
        def __init__(self, name):
            self.name = name
    
        def choice_course(self):
            print("学生点课系统")
    
    obj1 = Student("jason")
    obj2 = Student("kevin")
    obj3 = Student("oscar")
    print(obj1.__dict__)
    print(obj2.__dict__)
    print(obj3.__dict__)
    

  5. 对象的独有功能

    class Student:
        school_name = "清华大学"
    
        def __init__(self, name):
            self.name = name
    
        def choice_course(self):
            print(f"学生{self.name}点课系统")
    
    obj1 = Student("jason")
    obj2 = Student("kevin")
    obj3 = Student("oscar")
    """ 那个对象掉函数 那么函数里的 self  就是那个对象"""
    obj1.choice_course()
    obj2.choice_course()
    obj3.choice_course()
    

posted @ 2022-11-02 17:02  可否  阅读(22)  评论(0)    收藏  举报