今日内容概要

  • 面向对象之人狗大战
  • 面向对象编程思想
  • 面向对象之类与对象
  • 类与对象的创建
  • 对象独有的数据
  • 对象独有的功能

今日内容详细

面向对象之人狗大战

编写代码简单的实现人打狗 狗咬人的小游戏
'''推导步骤1 代码定义人和狗'''
person1 = {'name': 'jason',
        'age': 18,
        'gender': 'male',
        'p_type': '猛男',
        'atk_val': 999,
        'life_val': 100000}
dog1 = {'name': '小黑',
      'd_type': '泰迪',
      'atk_val': 100,
      'life_val': 8000}
# 如果需要多个人和狗需要重复编写上述字典
'''推导步骤2 将产生人和狗的字典封装成函数 并封装人和狗的攻击函数'''
def create_person(name, age, gender, p_type, atk_val, life_val):
	person = {'name': name,
          'age': age,
          'gender': gender,
          'p_type': p_type,
          'atk_val': atk_val,
          'life_val': life_val}
	return person
def create_dog(name, d_type, attack_val, life_val):
	dog = {'name': name,
        'd_type': d_type,
        'atk_val': atk_val,
        'life_val': life_val}
	return dog

def preson_atk(preson, dog):
	print(f'人{preson.get("name")}准备揍狗{dog.get("name")}')
	dog['life_val'] -= person.get('atk_val')
	print(f'人揍了狗一拳,狗{dog.get("name")}掉血{person.get('atk_val')},    剩余血量{dog.get('life_val')})
 
def dog_atk(dog, preson):
	print(f'狗{dog.get("name")}准备咬人{preson.get("name")}'
	person['life_val'] -= dog.get('atk_val')
	print(f'狗咬了人一口,人{preson.get("name")}掉血{dog.get('atk_val')},    剩余血量{person.get('life_val')})

p1 = create_person('jason', 18, 'male', '猛男', 8000, 99999999)
d1 = create_dog('小黑', '恶霸', 800, 900000)
person_atk(p1, d1)
dog_atk(d1, p1)

'''推导步骤3 人和狗的攻击混乱'''
person_atk(d1, p1)  # 变成狗揍人
dog_atk(p1, d1)  # 变成人咬狗
          
'''推导步骤4 如何实现只有人能调用人的攻击动作 狗只能调用狗的攻击动作
>>>:数据与功能的绑定'''
def get_person(name, age, gender, p_type, atk_val, life_val):
    # 产生人的函数(功能)
    def person_atk(person, dog):
        print(f"人:{person.get('name')}准备揍狗{dog.get('name')}")
        dog['life_val'] -= person.get('atk_val')
        print(f"人揍了狗一拳 狗掉血:{person.get('atk_val')}狗剩余血         量:{dog.get('life_val')}")
    # 表示人的信息(数据)
    person = {
        'name': name,
        'age': age,
        'gender': gender,
        'p_type': p_type,
        'atk_val': atk_val,
        'life_val': life_val,
        'person_atk': person_atk
    }
    return person
          
def get_dog(name, d_type, atk_val, life_val):
    def dog_atk(dog, person):
        print(f"狗:{dog.get('name')}准备咬人:{person.get('name')}")
        person['life_val'] -= dog.get('atk_val')
        print(f"狗咬了人一口 人掉血:{dog.get('atk_val')} 人剩余             血量:{person.get('life_val')}")
    dog = {
        'name': name,
        'd_type': d_type,
        'atk_val': atk_val,
        'life_val': life_val,
        'dog_atk': dog_atk
    }
    return dog
 
person = get_person('jason', 18, 'male', '猛男', 999, 1000000)
dog = get_dog('小黑', '恶霸', 100, 1000)
person.get('person_atk')(pseson, dog)
# 字典取值取到内层攻击函数名加括号调用并传入指定个数参数
          
'''面向对象和兴思想:数据与功能的绑定'''

编程思想

1.面向过程编程
	过程及流程 面向过程就是按照固定的流程解决问题
	需要例举出每一步的流程 并且随着步骤的深入 问题的解决越来越简单
	ps:提出问题 然后指定出该问题的解决方案
2.面向对象编程
	对象即容器 数据与功能的结合体(python中一切皆对象)
	面向对象编程有点类似于造物主的感觉 我们只需要创造出一个个对象 至于该对	象将来会如何发展跟程序员没有关系 也无法控制
	如 MOBA游戏中玩家操作的角色 只有基础属性 战绩的正负根据玩家操作 无法控    制
'''
两种编程思想没有优劣之分 需要结合实际需求而定
	如果是注册 登陆 肯定是面向过程更合适
	如果是游戏人物肯定是面向对象更合适
实际编程者两种思想是彼此交融的 只不过占比不同
'''

面向对象之类与对象

对象:数据与功能的结合体             对象才是核心
类:多个对象相同数据和功能的结合体      类主要是为了节省代码
'''
举例  不同物种进行分类
一个人          对象
一群人          人类(每个人都具有相同的特征 整合为一类)

一条狗          对象
一群狗          犬类(每条狗都具有相同的特征 整合为一类)
'''

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

类与对象的创建

面向对象并不是一门新技术 但是为了很好的区分开 针对面向对象设计了新的语法格式
python中一定要有类 才能借助于类产生对象

1.类的语法结构
class 类名:
	'''类体代码注释'''
	对象的公共数据
	对象的公共功能
'''
class是定义类的关键字
类名的命名与变量名几乎一致 需要注意的是首字母推荐大写用于后续区分
数据:变量名与数据值的绑定 功能(方法)其实就是函数
'''
2.类的定义与调用
	类在定义阶段就睡执行类体代码 但是属于类的局部名称空间 外界无法直接获取

# 需求:清华大学学生选课系统
# 定义类
class Student:
    # 对象公共的数据
    school_name = '清华大学'

    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')
# 查看名称空间
print(Student.__dict__)  # __dict__方法可以查看对应名称空间中所有的名字
# 取名称空间中的名字
print(Student.__dict__.get('school_name'))  # 清华大学
print(Student.__dict__.get('choice_course')) # choice_course所绑定的内存地址
'''在面向对象中 类和对象访问数据或者功能 可以统一采用句点符'''
print(Student.school_name)  # 等价于上述取名字
print(Student.choice_course)
'''类名加括号就会产生对象 并且没执行一次都会产生一个全新的对象'''
obj = Student()
obj1 = Student()
print(obj.__dict__)  # 对象自己目前什么都没有 但还是可以调用类中的名字
print(obj.school_name)  # 清华大学
# 修改类中的数据
Student.school_name = '哈尔滨佛学院'
print(obj.school_name) # 哈尔滨佛学院
'''数据和功能也可以统称为属性  数据>>>:属性名   功能>>>:方法'''

对象独有的数据

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

    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')
     
obj = Student()
obj1 = Student()
'''推导流程1 对象手动添加独有的数据'''
print(obj.__dict__)  # 将obj名称空间中的名字以字典的形式来展示
obj.__dict__['name'] = 'jason'  
# 此时的名称空间是字典的形式 可以通过添加键值对的方式在空间中添加数据
obj.__dict__['age'] = 18
print(obj.__dict__)
print(obj.name)
print(obj.age)  
print(obj1.__dict__)
obj1.__dict__['name'] = 'kevin'
obj1.__dict__['age'] = 28
print(obj1.__dict__)
print(obj1.name)
print(obj1.age)
'''推导流程2 将添加对象独有的数据封装成函数'''
def init(obj, name, age):
    obj.__dict__['name'] = name
    obj.__dict__['age'] = age
stu1 = Student()
stu2 = Student()
init(stu1, 'jason', 18)
init(stu2, 'kevin', 28)
print(stu1.__dict__)
print(stu2.__dict__)
'''推导流程3 给学生对象添加独有数据的函数 只有学生对象才有资格调用'''
class Student:
	school_name = '清华大学'
	def init(obj, name, age):
		obj.__dict__['name'] = name
		obj.__dict__['age'] = age
	def choice_course(self):
		print('学生选课系统')
stu1 = Student()
Student.init(stu1, 'jason', 18)
stu2 = Student()
Student.init(stu2, 'kevin', 28)
print(stu1.__dict__, stu2.__dict__)
'''推导步骤4 init方法变形'''
class Student:
	school_name = '清华大学'
	
	# 类产生对象的过程中会自动触发
	def __init__(obj, name, age):
		obj.__dict__['name'] = name
		obj.__dict__['age'] = age
	def choice_course(self):
		print('学生选课系统')
stu1 = Student('jason', 18)# 会自动将创建的对象传入__Init__中的第一个参数
print(stu1.__dict__)
print(sut1.name)
'''推导步骤5 变量名修改'''
class Student:
	school_name = '清华大学'
	def init(self, name, age):
		self.name = name
		self.age = age
	def choice_course(self):
		print('学生选课系统')
stu1 = Student('jason', 18)
print(stu1.name)
print(stu1.school_name)

对象的独有功能

class Student:
	school_name = '清华大学'
	def init(self, name, age):
		self.name = name
		self.age = age
	def choice_course(self):
		print('学生选课系统')
stu1 = Student('jason', 18) 
stu2 = Student('kevin', 28)
'''直接在全局定义功能'''
def eat():
	print('正在吃东西')
stu1.eat = eat
stu1.eat()
# eat函数所有人都能调用 就不是对象独有的了
'''只能将函数放在类中 但是类中的函数又是对象公共的
定义在类中的功能 默认就是绑定给对象使用的 谁来调用谁就是主人公
'''
class Student:
	school_name = '清华大学'
	def init(self, name, age):
		self.name = name
		self.age = age
	def choice_course(self):
		print('学生选课系统')
	def eat(self):
		print(f'{self.name}正在吃东西')
stu1 = Student('jason', 18)
stu2 = Student('kevin', 28)
stu1.eat()  # jason正在吃东西
# 对象调用会自动将对象当做第一个参数传入
stu2.eat()  # kevin正在吃东西

# 对象修改数据值
stu1.name = 'tom'    # 当点的名字存在的时候 会修改对应数据值
# 对象新增数据值
stu1.hobby = 'read'  # 当点的名字不存在的时候 会新增数据


原文地址:http://www.cnblogs.com/lzjjjj/p/16851617.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性