面对对象和面对过程编程

实际编程过程中,面向过程结合面向对象一起使用。

什么是面向对象

指的是一门编程思想

什么是面向过程编程

核心是'过程‘二字,过程指的是做事情的步骤,比如先做什么,在做什么

基于该编程思想编写程序,就好比一条工厂的流水线,一种机械式的思维方式

优点:逻辑清晰,复杂的问题流程化,进而简单化

缺点:可扩展性差

什么是面对对象编程

核心是’对象‘二字,对象指的是特征和技能的结合体

基于该编程思想编写程序,就好比在创造世界,一种上帝式的思维方式

优点:可扩展性高

缺点:编写程序的复杂程度要远高于面向过程编程思想

对象是特征和技能的结合体,类是一系列对象相同的特征和技能的集合体

类的定义

class 类名:
    特征
    技能
  1. 类名必须要遵循驼峰体
  2. 通过调用类名,来创造对象

定义类时发生的事情

  1. 类在定义时,会产生一个空的名称空间

  2. 会把类内部所有名字,扔进类的名称空间中

    注意:类在定义阶段就已经产生好了名称空间,执行python文件时会执行类内部的代码

__dict__.

  1. .可以对类内部的特征进行增删改查的操作
  2. __dict__只能进行查的操作
  3. 对象也有__dict__
class OldStudent:
    schoo = 'oldboy'

    def learn(self):
        print('learn')

# 查看类的名称空间内的所有名字
print(OldStudent.__dict__)  # type:字典

# .可以对类中的名字进行修改,而__dict__不能
OldStudent.school = 'oldgirl'
print(OldStudent.school)  # ‘oldgirl

对象

调用类即会产生对象,也叫实例化对象

名称空间

  1. 类的名称空间在定义阶段就已经产生了
  2. 对象的名称空间在调用类的时候产生

__init__函数

为了解决对象和对象之间特征和技能一样的问题产生,可以为对象初始化某些属性

  1. 在调用类时,自动触发该函数
class OldStudent:
    school = 'oldboy' # 共有属性
    def __init__(self,name,age):  # 特有属性
        self.name = name
        self.age = age

    def learn():
        print('learn')

stu1 = OldStudent('wick',24)  # 实例化对象        

调用类发生的事情

  1. 首先产生一个空的对象,即产生'对象的名称空间'

  2. 自动触发__init__

  3. 把对象本身以及括号内的参数一并传给init函数

    总结:调用类会产生一个对象,调用类的过程叫做类的实例化,产生的对象称之为类的一个实例

对象与类的查找顺序

  1. 对象,优先查找对象本身
  2. 类,对象中找不到就去类中找
  3. 报错,类中也找不到就报错

对象绑定方法的特殊之处

  1. 由类调用类内部的函数,该函数只是一个普通的函数,普通函数需要接受几个参数,就得传入几个参数
  2. 由对象来调用称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同的对象传入该绑定方法中

总结:对象绑定方法,是由对象来调用的额,特殊之处就是把对象当作第一个参数传入该方法中

python中一切皆对象

八大数据类型内置方法的实现都是通过定义类,然后实例化一个对象来实现的

英雄联盟小游戏练习

import random
import time
class Yasso:
    camp = 'lonia'
    def __init__(self,name):
        self.name = name
        self.atk = 48
        self.armor = 15
        self.health = 430
        self.money = 1200

    def attack(self, zed):
        damage = self.atk - zed.armor
        zed.health -= damage
        print(f'''{self.name}攻击了{zed.name},伤害:-{damage}
                {zed.name}剩余血量:{zed.health}\n''')
        if zed.health <= 0:
            return True

class Zed:
    camp = 'shadow'
    def __init__(self,name):
        self.name = name
        self.atk = 49
        self.armor = 17
        self.health = 445
        self.money = 1200

    def attack(self, yasso):
        damage = self.atk - yasso.armor
        yasso.health -= damage
        print(f'''{self.name}攻击了{yasso.name},伤害:-{damage}
        {yasso.name}剩余血量:{yasso.health}\n''')
        if yasso.health <= 0:
            return True

class Belt:
    weapon_type = 'defence'
    def __init__(self,name):
        self.name = name
        self.price = 1000
        self.health = 380

    def equip(self,obj):
        obj.money -= self.price
        obj.health += self.health

class BigSword:
    weapon_type = 'attack'
    def __init__(self,name):
        self.name = name
        self.price = 1200
        self.atk = 60

    def equip(self,obj):
        obj.money -= self.price
        obj.atk += self.atk

wick = Zed('火影劫')
tank = Yasso('快乐风男')
titan = Belt('巨人腰带')
storm = BigSword('暴风大剑')

print(f'''
玩家wick使用英雄{wick.name}
生命值:{wick.health}
攻击力:{wick.atk}
护甲:{wick.armor}
金币:{wick.money}\n''')
time.sleep(1.8)

print(f'''玩家tank使用英雄{tank.name}
生命值:{tank.health}
攻击力:{tank.atk}
护甲:{tank.armor}
金币:{tank.money}\n''')
time.sleep(1.8)

if wick.money >= storm.price:
    wick.storm = storm
    storm.equip(wick)
    print(f'{wick.name}购买了{storm.name}')
    time.sleep(1)

if tank.money >= titan.price:
    tank.titan = titan
    titan.equip(tank)
    print(f'{tank.name}购买了{titan.name}')
    time.sleep(1)

print(f'''
玩家wick使用英雄{wick.name}
生命值:{wick.health}
攻击力:{wick.atk}
护甲:{wick.armor}
金币:{wick.money}
装备:{wick.storm.name}\n''')
time.sleep(1.8)

print(f'''玩家tank使用英雄{tank.name}
生命值:{tank.health}
攻击力:{tank.atk}
护甲:{tank.armor}
金币:{tank.money}
装备:{tank.titan.name}\n''')
time.sleep(1.8)

while True:
    rand = random.randint(1,3)

    if rand == 1:

        res = wick.attack(tank)
        time.sleep(0.8)
        if res:
            print(f'''玩家wick使用{wick.name}很轻松的击杀了菜鸡玩家tank使用的{tank.name}''')
            break

    if rand == 2:

        res1 = tank.attack(wick)
        time.sleep(0.8)
        if res1:
            print(f'''玩家tank使用{tank.name}卑鄙无耻的侥幸击杀了玩家wick使用的{wick.name}''')
            break

最新文章

  1. WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】
  2. 一篇文章让Oracle程序猿学会MySql【未完待续】
  3. VPN服务器是什么?
  4. maya,mel,eval,stringarray
  5. Java的历史
  6. HTTP路由
  7. Linux Oracle服务启动&amp;停止脚本与开机自启动
  8. js动态加载脚本
  9. toj2867 Picking Problem
  10. Java面试题之weblogic相关问题
  11. 5_Longest Palindromic Substring(Manacher) --LeetCode
  12. 秋名山老司机(BS4与正则的比拼)
  13. Win 10 系统下研华采集卡Advantech Navi SDK虚拟demo设备安装方法
  14. hbase数据原理及基本架构
  15. day03-课堂笔记-大纲
  16. 【转】MySQL:日期函数、时间函数总结(MySQL 5.X)
  17. 查看电脑本机的ip地址
  18. caffe添加自己编写的Python层
  19. 存在重复元素(python3)
  20. c语言的字符串拷贝函数的精简

热门文章

  1. NABCD分析 [团队任务]
  2. Android Studio [跑马灯]
  3. C/C++ 中带空格字符串输入的一些小trick
  4. linux查看cpu核数和内存指令
  5. Ceph 的 &#39;MAX AVAIL&#39; 和 数据平衡 - Storage 6
  6. TP5安装workerman版本的坑
  7. mysql配置默认字符集为UTF8mb4
  8. Ansible Roles角色
  9. BF算法(蛮力匹配)
  10. 安装VMworkstation和Centos虚拟机