发布时间:2022-11-02 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

一、人狗大战

1、需求

Python基础之面向对象:1、面向对象及编程思想

推导一:

# 1、在字典内储存‘人’属性
person = {
     'name': '阿拉蕾',
     'age': 18,
     'gender': '女',
     'p_type': '战士',
     'attack_val': 8000,
     'life_val': 99999999
 }
# 2、在字典内储存‘狗’特有属性
 dog1 = {
     'name': '小黑',
     'd_type': '泰迪',
     'attack_val': 100,
     'life_val': 8000
 }

推导二:

# 1、封装‘人’属性函数
def create_person(name, age, gender, p_type, attack_val, life_val):
    person_dict = {
        'name': name,
        'age': age,
        'gender': gender,
        'p_type': p_type,
        'attack_val': attack_val,
        'life_val': life_val
    }
    return person_dict
# 2、封装‘狗’属性的函数
def create_dog(name, d_type, attack_val, life_val):
    dog_dict = {
        'name': name,
        'd_type': d_type,
        'attack_val': attack_val,
        'life_val': life_val
    }
    return dog_dict
# 3、生成多个‘人’和‘狗’
p1 = create_person('阿拉蕾', 18, '男', '战士', 8000, 99999999)
p2 = create_person('小朵朵', 28, '女', '法师', 100, 800)
d1 = create_dog('小黑', '泰迪', 100, 8000)
d2 = create_dog('小白', '斗牛', 100, 800000)

推导三:

# 1、人打狗的动作
def person_attack(person_dict, dog_dict):
    print(f"{person_dict.get('name')}踢向{dog_dict.get('name')}")
    dog_dict['life_val'] -= person_dict.get('attack_val')
    print(f"人踢了狗一脚 狗掉血:{person_dict.get('attack_val')} 狗剩余血量:{dog_dict.get('life_val')}")
# 2、狗打人的动作
def dog_attack(dog_dict, person_dict):
    print(f"{dog_dict.get('name')}向{person_dict.get('name')}咬去")
    person_dict['life_val'] -= dog_dict.get('attack_val')
    print(f"狗咬了人一口 人掉血:{dog_dict.get('attack_val')} 人剩余血量:{person_dict.get('life_val')}")
# 3、调用双方各自的函数,即可模拟出双方打架的动作
person_attack(p1, d1)  # 人打狗
dog_attack(d2, p2)  # 狗咬人
-------------------------------------------------------
阿拉蕾踢向小黑
人踢了狗一脚 狗掉血:8000 狗剩余血量:0
小白向小朵朵咬去
狗咬了人一口 人掉血:100 人剩余血量:700

2、核心思路

需求:

推导一:

"""推导步骤4:如何实现只有人只能调用的人的攻击动作  狗只能调用狗的攻击动作>>>:数据与功能的绑定"""
def get_person(name, age, gender, p_type, attack_val, life_val):
    # 产生人的函数(功能)
     def person_attack(person_dict, dog_dict):
        print(f"{person_dict.get('name')}踢向{dog_dict.get('name')}")
        dog_dict['life_val'] -= person_dict.get('attack_val')
        print(f"人踢了狗一脚 狗掉血:{person_dict.get('attack_val')} 狗剩余血量:{dog_dict.get('life_val')}")
    # 表示人的信息(数据)
    person_dict = {
        'name': name,
        'age': age,
        'gender': gender,
        'p_type': p_type,
        'attack_val': attack_val,
        'life_val': life_val,
        'person_attack': person_attack
    }
    return person_dict
def get_dog(name, d_type, attack_val, life_val):
    def dog_attack(dog_dict, person_dict):
        print(f"{dog_dict.get('name')}向{person_dict.get('name')}咬去")
        person_dict['life_val'] -= dog_dict.get('attack_val')
        print(f"狗咬了人一口 人掉血:{dog_dict.get('attack_val')} 人剩余血量:{person_dict.get('life_val')}")
    dog_dict = {
        'name': name,
        'd_type': d_type,
        'attack_val': attack_val,
        'life_val': life_val,
        'dog_attack': dog_attack
    }
    return dog_dict
person1 = get_person('jason', 18, 'male', '猛男', 8000, 99999999)
dog1 = get_dog('小黑', '恶霸', 800, 900000)
person1.get('person_attack')(person1, dog1)

结论:

人狗大战推导就是面对对象的核心思想:数据与功能的绑定!!

二、编程思想

引言:

1、面向过程编程

2、面向对象编程

上述两种编程思想没有优劣之分 需要结合实际需求而定
如果需求是注册 登录 人脸识别肯定面向过程更合适
如果需求是游戏人物肯定是面向对象更合适
实际编程两种思想是彼此交融的 只不过占比不同

三、面向对象

1、类与对象

对象:

类:

2、类与对象的创建

现实中一般是先有对象再有类
程序中如果想要产生对象 必须要先定义出类

1.语法结构

class 类名:
	'''代码注释'''
	对象公共的数据
	对象公共的功能
1.class是定义类的关键字
2.类名几乎和变量名一致,使用的时候推荐类名的首字母大写
3.数据:
	变量名与数据值的绑定
  功能:
	功能(方法)其实就是具有一定功能的函数

2.定义与调用

需求:

'''
类在定义阶段就会执行类函数体代码
但类的函数体代码外界无法直接调用
'''
1、定义类
class Student:
    # 对象公共的数据
    school_name = '清华大学'
    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能') 

查看类的名称空间:

print(Student.__dict__)
# {'__module__': '__main__', 'school_name': '清华大学', 'choice_course': <function Student.choice_course at 0x0000018FCCCD5670>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
print(Student.__dict__.get('school_name'))
# 清华大学
print(Student.__dict__ .get('choice_course'))
# <function Student.choice_course at 0x000001417B975670>

类的调用:

1、调用对象
    obj1 = Student()  
    # <__main__.Student object at 0x000001992C2759D0> 
    obj2 = Student()
    # <__main__.Student object at 0x000001992C278E50>
    obj3 = Student()
    # <__main__.Student object at 0x000001992C278E20>
'''
三个变量名的地址各不相同,产生三个对象
 '''
2、查看对象内部数据
    print(obj1.__dict__,
        obj2.__dict__,
        obj3.__dict__)
    # {} {} {}
'''
三个对象各自内部都为空
 '''
3、调用对象共同数据
    print(obj1.school_name)
    # 清华大学
    print(obj2.school_name)
    # 清华大学
    print(obj3.school_name)
    # 清华大学
'''
同一类产生的对象,都可使用类内部公用数据值
'''

数据和功能可称统称为属性:

  • 数据>>>属性名

  • 功能>>>方法

3、对象独有数据

​ 在上述使用类产生对象时,我们可以看出产生的对象并没有自己特有的数据,针对如何给对象手动添加独有数据,python提供了多种方式,其中前4种方式主要为推导第五种方式而来,我们只需简单了解即可,在日后我们重点使用的是第五种方式

第一种:

obj1.__dict__['name'] = 'jason'
obj1.__dict__['age'] = 18
obj1.__dict__['hobby'] = 'study'

第二种:

def init(ojb,name,age,hobby)
    oib.__dict__['name'] = name
    obj.__dict__['age'] = age
    obj.__dict__['hobby'] = hobby
init(ojb1.'kangkang', 18, 'read')
init(ojb2, 'zhangzhang', 28, 'ball')

第三种:

class Student:
    # 对象公用的数据
    school_name = '清华大学'
    # 专门给学生添加独有数据的功能
    def init(ojb, name, age, hobby):
        oib.__dict__['name'] = name
        obj.__dict__['age'] = age
        obj.__dict__['hobby'] = hobby
        # 对象公共的功能
	 def choice_course(self):
         print('学生选课功能')
stu1 = Student()
Student.init(stu1, 'kangkang', 18 , 'read')
Student.init(stu2, 'zhangzhang', 28 , 'ball')

第四种:

class Student:
    # 对象公用的数据
    school_name = '清华大学'
    # 专门给学生添加独有数据的功能
    def __init__(ojb, name, age, hobby):
        oib.__dict__['name'] = name
        obj.__dict__['age'] = age
        obj.__dict__['hobby'] = hobby
        # 对象公共的功能
	 def choice_course(self):
         print('学生选课功能')
stu1 = Student()
Stu1.Student('kangkang', 18, 'read')
Stu2.Student('zhangzhang', 28, 'ball')

第五种:

class Student:
    # 对象公用的数据
    school_name = '清华大学'
    # 专门给学生添加独有数据的功能
    def __init__(self, name, age, hobby):
        oib.__dict__['name'] = name
        obj.__dict__['age'] = age
        obj.__dict__['hobby'] = hobby
        # 对象公共的功能
	 def choice_course(self):
         print('学生选课功能')
stu1 = Student('kangkang', 18, 'read')
stu1 = Student('zhangzhang', 18, 'ball')

4、对象独有功能

​ 上述学习了如何给相同类对象添加独有数据的方式,下面我们要学习如何给对象添加独有功能

思考:

解决方法:

class Student:
    # 对象公用的数据
    school_name = '清华大学'
    # 专门给学生添加独有数据的功能
    def __init__(self, name, age, hobby):
        oib.__dict__['name'] = name
        obj.__dict__['age'] = age
        obj.__dict__['hobby'] = hobby
        # 对象公共的功能
	 def choice_course(self):
         print('学生选课功能')
stu1 = Student()
Student.choice_course(stu1)

5、补充知识

1、对象数据值修改

# 只需要使用对象‘点’的数据绑定的变量名的方式重新赋值即可
stu1.name = 'zhaozhao'
# 当名字不存在的情况下,将直接新增数据
stu1.paw = 123