zoukankan      html  css  js  c++  java
  • day22 面向过程与面向对象的介绍 类的定义和使用 产生对象 类名称空间与对象名称空间以及属性查找 绑定方法的特殊之处 一切皆对象 小练习 对象交互之人狗大战 总结 今日作业

    1、面向过程编程

    核心过程二字,过程指的是解决问题的步骤,即先干什么,再干什么

    基于该思想编写程序就好比在设计一条流水线,是一种机械的思维方式。

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

      缺点:扩展性差

    2、面向对象

    核心"对象"二字,对象指的是特征与技能的结合体,基于该思想编写程序

    就好比在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式

      优点:可扩展性强

      缺点:编程的复杂度高于面向过程

    =================================================================

    PS.面向对象仅仅是解决了可扩展性的问题,并没有代表全部

    1、类

    对象是特征与技能的结合体,那类就是一系列对象相同的特征与技能的结合体

    2、在现实生活中P:一定是先有对象,后来随着人类文明的发展总结出的类,对象是具体存在的,而类只是一种抽象概念

    3、在程序中,务必保证:先定义类,后调用类来产生对象

    现实生活中的对象:
        对象1:
            特征:
                school="Oldboy"
                name="马冬梅"
                age=18
                sex="female"
            技能:
                学习
                选课
    
        对象2:
            特征:
                school="Oldboy"
                name="甜蜜蜜"
                age=21
                sex="male"
            技能:
                学习
                选课
    
        对象3:
            特征:
                school="Oldboy"
                name="原石开"
                age=22
                sex="male"
            技能:
                学习
                选课
    
    现实生活中的老男孩学生类:
         相同的特征
                school="Oldboy"
         相同的技能
                学习
                选课
    '''
    类名一般用驼峰体
    #1、程序中的类
    class OldboyStudent:
        # 用变量表示特征
        school="Oldboy"
    
        #  用函数表示技能
        def learn(self):
            print('is learning...')
    
        def choose(self):
            print('choose course...')
    
        # print('======>')
    
    注意:在定义类的阶段会立刻执行类体内的代码,然后将产生的名字存放于类名称空间中
    print(OldboyStudent.__dict__)
    print(OldboyStudent.__dict__['school'])
    print(OldboyStudent.__dict__['learn'])
    OldboyStudent.__dict__['learn'](123)
    
    print(OldboyStudent.school) # OldboyStudent.__dict__['school']
    print(OldboyStudent.learn) # OldboyStudent.__dict__['learn']
    OldboyStudent.learn('xxx')
    OldboyStudent.learn('xxx')
    
    OldboyStudent.country='China'   #新增属性
    OldboyStudent.school='偶的博爱' #改属性
    
    del OldboyStudent.country
    print(OldboyStudent.__dict__)
    
    2、调用类,产生程序中的对象

    产生对象

    类名称空间与对象名称空间以及属性查找

    # 1、程序中的类
    class OldboyStudent:
        # 用变量表示特征
        school = "Oldboy"
    
        # stu1, "马冬梅", 18, 'female'
        def __init__(self, name, age, sex):  
            # self=stu1     name= "马冬梅"   age=18     sex="female"
            # print('==========init run=============>')
            self.name = name  # stu1.name = "马冬梅"
            self.age = age  # stu1.age = 18
            self.sex = sex  # stu1.sex = "female"
    
        #  用函数表示技能
        def learn(self):
            print('is learning...', self)
    
        def choose(self):
            print('choose course...')
    
    在程序中:必须先定义类 - -----》调用类 - -----》对象
    
    stu1=OldboyStudent()
    stu1.NAME='马冬梅'
    stu1.AGE=18
    stu1.SEX="female"
    
    stu2=OldboyStudent()
    stu2.NAME='甜蜜蜜'
    stu2.AGE=21
    stu2.SEX="male"
    
    stu3=OldboyStudent()
    stu3.NAME='原石开'
    stu3.AGE=22
    stu3.SEX="male"
    
    print(stu1.NAME,stu1.school)
    print(stu2.NAME,stu2.school)
    print(stu3.NAME,stu3.school)
    上述产生的三个对象都一样了
    
    调用类发生哪些事:
    1、首先会产生一个空对象stu1
    2、会自动触发类内部的__init__函数
    3、然后将空对象stu1连同调用类时括号内的参数组成(stu1,"马冬梅",18,'female'),
    将这四个参数一起传给__init__函数
    
    stu1=OldboyStudent("马冬梅",18,'female')
    #OldboyStudent.__init__(stu1,"马冬梅",18,'female')
    stu2=OldboyStudent("甜蜜蜜",21,'male')
    #OldboyStudent.__init__(stu2,"甜蜜蜜",21,'male')
    stu3=OldboyStudent("原石开",22,'male')
    
    print(stu1.name,stu1.age,stu1.sex)
    print(stu2.name,stu2.age,stu2.sex)
    print(stu3.name,stu3.age,stu3.sex)

    类名称空间与对象名称空间以及属性查找

    school = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
    
    class OldboyStudent:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        # self=stu1
        def learn(self):
            print('%s is learning' % self.name)
    
        def choose(self, course):
            print('%s is choosing %s' % (self.name, course))
    
    
    # 调用类---》产生类的对象,该对象也可以称为类的一个实例,
    # 调用类的过程也称为类的实例化
    stu1 = OldboyStudent('李三胖', 18, 'male')
    # OldboyStudent.__init__(stu1,'李三胖',18,'male')
    
    # OldboyStudent.country='CHINA'
    # print(OldboyStudent.country)
    
    # print(OldboyStudent.__dict__)
    # print(stu1.__dict__)
    # print(stu1.__dict__['name'])
    # print(stu1.name)
    # print(stu1.school)
    # print(school)
    
    stu2 = OldboyStudent('王大炮', 28, 'male')
    # print(stu2.__dict__)
    
    # 类内部定义的变量是给所有对象共享,所有对象指向的都是同一个内存地址
    # print(id(stu1.school))
    # print(id(stu2.school))
    # print(id(OldboyStudent.school))
    

    绑定方法的特殊之处

    类内部定义的函数,类可以使用,但类来用的时候就是一个普通函数,
    普通函数有几个参就传几个参数
    print(OldboyStudent.learn)
    OldboyStudent.learn(123)
    
    类内部定义的函数,其实是给对象使用的,而且是绑定给对象用,
    绑定给不同的对象就是不同的绑定方法
    print(stu1.learn)
    print(stu2.learn)
    绑定方法的特殊之处在于,谁来调用,就会将谁当作第一个参数自动传入
    stu1.learn()  # OldboyStudent.learn(stu1)
    stu2.learn()  # OldboyStudent.learn(stu2)
    
    stu1.choose('python')
    stu2.choose('linux')

    一切皆对象

    class OldboyStudent:
        school='oldboy'
    
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        #self=stu1
        def learn(self):
            print('%s is learning' %self.name)
    
        def choose(self,course):
            print('%s is choosing %s' %(self.name,course))
    
    stu2=OldboyStudent('王大炮',28,'male')
    
    # print(id(stu2))
    # print(type(stu2)) # 类与类型是一个概念
    # print(stu2)
    
    l1=[1,2,3] #l1=list([1,2,3])
    # print(type(l1))
    # l1.append(4)
    list.append(l1,4)
    print(l1)
    
    l2=['a','b','c']
    l2.append('d')
    # list.append('d')
    print(l2)
    
    print(int)
    print(str)
    print(dict)
    print(tuple)
    print(set)
    print(OldboyStudent)

     小练习 (实例化三次)

    # class Foo:
    #     n=0
    #     def __init__(self):
    #         Foo.n+=1 # Foo.n=3
    #
    # obj1=Foo()
    # obj2=Foo()
    # obj3=Foo()
    # print(obj1.__dict__)
    # print(obj2.__dict__)
    # print(obj3.__dict__)
    #
    # print(obj1.n)
    # print(obj2.n)
    # print(obj3.n)

    对象交互之人狗大战

    #对对象属性的增删改查
    # class Bar:
    #     n=1111111111
    #     def __init__(self,x):
    #         self.x=x
    #
    # obj=Bar(111)
    #
    # # print(obj.__dict__)
    # # print(obj.n)
    # obj.y=2
    # obj.n=3
    # print(obj.__dict__)
    # print(obj.n)
    #
    # obj.x=123
    # del obj.x
    # print(obj.x)
    '''
    现实中的对象:
        人1
            特征:
                名字='刘晴政'
                攻击力=60
                生命值=100
            技能:
                咬
    
        人2
            特征:
                名字='王苗璐'
                攻击力=50
                生命值=100
            技能:
                咬
    
    现实中的人类
        相同的特征
        相同的技能
            咬
    '''
    
    '''
    现实中的对象:
        狗1
            特征:
                名字='武培其'
                品种="京巴"
                攻击力=80
                生命值=50
            技能:
                咬
    
        人2
            特征:
                名字='李杰'
                品种="藏獒"
                攻击力=200
                生命值=200
            技能:
                咬
    
    现实中的狗类
        相同的特征
        相同的技能
            咬
    '''
    class People:
        def __init__(self, name, aggresivity, life_value=100):
            self.name = name
            self.aggresivity = aggresivity
            self.life_value = life_value
    
        def bite(self, enemy): #self=p1   enemy=d1
            enemy.life_value-=self.aggresivity
            print("""
            人[%s] 咬了一口狗 [%s]
            狗掉血[%s]
            狗还剩血量[%s]
            """ %(self.name,enemy.name,self.aggresivity,enemy.life_value)
            )
    
    class Dog:
        def __init__(self, name, dog_type, aggresivity, life_value):
            self.name = name
            self.dog_type = dog_type
            self.aggresivity = aggresivity
            self.life_value = life_value
    
        def bite(self, enemy): #self = d1    enemy= p1
            enemy.life_value-=self.aggresivity
            print("""
            狗[%s] 咬了一口人 [%s]
            人掉血[%s]
            人还剩血量[%s]
            """ %(self.name,enemy.name,self.aggresivity,enemy.life_value)
            )
    p1 = People('刘清政', 60)
    d1=Dog('李杰',"藏獒",200,200)
    
    p1.bite(d1)
    d1.bite(p1)
    

    绑定:谁调用他就代表谁

    相关补充

    在python3中定义类的时候默认定义继承object的类,方便python2识别
    class OldboyPeople(object):
    
    #python为类内置的特殊属性
    类名.__name__# 类的名字(字符串)
    类名.__doc__# 类的文档字符串
    类名.__base__# 类的第一个父类(在讲继承时会讲)
    类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
    类名.__dict__# 类的字典属性
    类名.__module__# 类定义所在的模块
    类名.__class__# 实例对应的类(仅新式类中)
    
    类的特殊属性(了解即可)

    今日作业

    面向对象作业
    1.默写:面向对象与面向过程的优缺点对比,及使用场景
    2.初始化函数的作用是什么,有什么特点

    作用:
    init 函数用于初始化对象,它会在创建对象时,自动执行,
    并传入调用类时传递的参数,第一个参数表示要初始化的对象本身,
    
    特点:
    self(第一个)参数不需要手动传递
    self表示对象自己 是一个形式参数,名字可以随便取,但是不建议修改

    3.什么是绑定方法,有什么特点

    绑定方法:把对象与函数进行绑定
    特点:谁来调用,就会将谁当作第一个参数自动传入

    4.对象与类的属性查找顺序什么怎么样的

    当对象中不存在是会到类里面查找,如果对象中存在这个属性,优先访问对象中的属性
    # 查找顺序为 对象 ->  类

    5.什么是类?  什么是对象?

    对象是特征与技能的结合体
    类是一系列特征与技能的结合体

    6.扩展题
    设计王者荣耀中的英雄类,每个英雄对象可以对其他英雄对象使用技能
    具备以下属性
    英雄名称,等级,血量
    和Q_hurt,W_hurt,E_hurt 三个属性,表示各技能的伤害量
    具备以下技能
    Q W E
    三个技能都需要一个敌方英雄作为参数,当敌方血量小于等于0时输出角色死亡

    class Hero:
    
        def __init__(self,name,level,hp,Q_hurt,W_hurt,E_hurt):
            self.name = name
            self.level = level
            self.hp = hp
            self.Q_hurt = Q_hurt
            self.W_hurt = W_hurt
            self.E_hurt = E_hurt
    
        def Q(self,enemy):
    
            enemy.hp -= self.Q_hurt
            print("%s 对%s 释放了 %s 技能" % (self.name,enemy.name,"Q"))
            print("造成了%s点伤害,剩余血量%s" % (self.Q_hurt, enemy.hp))
            if enemy.hp <= 0:
                print("%s被%s弄死了" % (enemy.name,self.name))
    
        def W(self,enemy):
            enemy.hp -= self.W_hurt
            print("%s 对%s 释放了 %s 技能" % (self.name, enemy.name, "W"))
            print("造成了%s点伤害,剩余血量%s" % (self.W_hurt,enemy.hp))
            if enemy.hp <= 0:
                print("%s被%s弄死了" % (enemy.name, self.name))
    
        def E(self,enemy):
            enemy.hp -= self.E_hurt
            print("%s 对%s 释放了 %s 技能" % (self.name, enemy.name, "E"))
            print("造成了%s点伤害,剩余血量%s" % (self.E_hurt, enemy.hp))
            if enemy.hp <= 0:
                print("%s被%s弄死了" % (enemy.name, self.name))
    
    # 创建两个英雄
    hero1 = Hero("小妲己",15,2000,50,500,600)
    
    hero2 = Hero("小鲁班",15,1500,50,500,600)
    
    hero1.Q(hero2)
    hero1.W(hero2)
    hero1.E(hero2)
    hero1.E(hero2)
    

      

  • 相关阅读:
    HTML表单
    CSS等高布局的6种方式
    HTML用户反馈表单
    HTML美化修饰<A>
    sql查询语句 --------一个表中的字段对应另外一个表中的两个字段的查询语句
    jq 表格添加删除行
    js 静止f1到f12 和屏蔽鼠标右键
    手机自适应页面的meta标签
    tp3.2 的验证码的使用
    php多线程抓取网页
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/10098125.html
Copyright © 2011-2022 走看看