zoukankan      html  css  js  c++  java
  • 面向对象基础

    一、面向对象编程介绍

    一、面向过程编程

    面向过程变成的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么……

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

    • 优点:复杂的问题流程化、进而简单化
    • 缺点:扩展性差

    二、面向对象编程

    面向对象编程的核心是对象二字,对象是特征与技能的结合体。

    基于面向对象编程的思想编写程序,就好比是在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式。

    • 优点:可扩展性强
    • 缺点:编程的复杂度要高于面向过程

    二、类和对象

    一、类和对象

    • 类的意思:种类、分类、类别

    对象是特征与技能的结合体,我可能有身高体重、而你也有身高体重,所以你会说你像我,但是你一定不会说你像阿猫阿狗。并且我和你其实就可以说成是一类,而你和选课系统不能说是一类,因此给出类的定义:类就是一系列对象相似的特征与技能的结合体。

    在现实世界中:先有一个个具体存在的对象,然后随着人类文明的发展才了分类的概念,既然现实世界中有类这个概念,Python程序中也一定有类这个概念,但是在Python程序中:必须先定义类,然后调用类来产生对象。

    二、现实世界中定义类和对象

    就拿未来我们的选课系统来讲,我们先总结一套现实世界中的学生对象:

    • 对象1:
      • 特征:
        • 学校='oldboy'
        • 姓名='耗哥'
        • 年龄=18
        • 性别='male'
      • 技能:
        • 选课
    • 对象2:
      • 特征:
        • 学校='oldboy'
        • 姓名='猪哥'
        • 年龄=17
        • 性别='male'
      • 技能:
        • 选课
    • 对象3:
      • 特征:
        • 学校='oldboy'
        • 姓名='帅翔'
        • 年龄=19
        • 性别='female'
      • 技能:
        • 选课

    2.2 定义对象

    站在未来选课系统的角度,我们还可以总结现实世界中的学生类:

    • 老男孩学生类:
      • 相似的特征:
        • 学校='oldboy'
      • 相似的技能
        • 选课

    三、程序中定义类和对象

    3.1 定义对象

    # 注意类中定义变量使用驼峰体
    class OldboyStudent():
        school = 'oldboy'
    
        def choose_course(self):
            print('is choosing course')
    
    • 曾经定义函数,函数只检测语法,不执行代码,但是定义类的时候,类体代码会在类定义阶段就立刻执行,并且会产生一个类的名称空间,也就是说类的本身其实就是一个容器/名称空间,是用来存放名字的,这是类的用途之一

    83-类与对象-名称空间.jpg?x-oss-process=style/watermark

    print(OldboyStudent.__dict__)
    

    {'module': 'main', 'school': 'oldboy', 'choose_course': <function OldboyStudent.choose_course at 0x10d653ae8>, 'dict': <attribute 'dict' of 'OldboyStudent' objects>, 'weakref': <attribute 'weakref' of 'OldboyStudent' objects>, 'doc': None}

    print(OldboyStudent.__dict__['school'])
    

    oldboy

    print(OldboyStudent.__dict__['choose_course'])
    

    <function OldboyStudent.choose_course at 0x10d653ae8>

    try:
        OldboyStudent.__dict__['choose_course']()
    except Exception as e:
        print('error:', e)
    

    error: choose_course() missing 1 required positional argument: 'self'

    print(OldboyStudent.school)
    

    oldboy

    OldboyStudent.choose_course(111)
    

    is choosing course

    print(OldboyStudent.choose_course)
    

    <function OldboyStudent.choose_course at 0x10d653ae8>

    OldboyStudent.__dict__['choose_course']
    

    <function main.OldboyStudent.choose_course(self)>

    OldboyStudent.country='China'
    OldboyStudent.__dict__['country']
    'China'
    OldboyStudent.country='CHINA'
    OldboyStudent.__dict__['country']
    

    'CHINA'

    del OldboyStudent.school
    print(OldboyStudent.__dict__)
    

    {'module': 'main', 'school': 'oldboy', 'choose_course': <function OldboyStudent.choose_course at 0x10d653ae8>, 'dict': <attribute 'dict' of 'OldboyStudent' objects>, 'weakref': <attribute 'weakref' of 'OldboyStudent' objects>, 'doc': None, 'country': 'CHINA'}

    3.2 定义对象

    • 调用类即可产生对象,调用类的过程,又称为类的实例化,实例化的结果称为类的对象/实例

    83-类与对象-实例化.jpg?x-oss-process=style/watermark

    stu1=OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
    print(stu1.school)
    

    oldboy

    stu2=OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
    print(stu2.school)
    

    oldboy

    stu3=OldboyStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
    stu3.choose_course()
    

    is choosing course

    三、绑定方法

    定义在类内部的方法:

    • 如果类来调用:就是一个普通函数,有几个参数就需要传几个参数
    • 对象来调用:它叫对象的绑定方法,第一个参数不需要传,自动传递

    示例:

    class Student:
        #变量表示属性
        school='oldboy'
        #__init__ 看好名字,不是__int__
        def __init__(x,name):
            x.name=name
        def choose(self):
            print("选课....")
        def study(self):
            print('%s学会了python'%self.name)
    
    stu1=Student('nick')
    stu1.study()
    stu1=Student('李铁蛋')
    stu1.study()
    

    四、一切皆对象

    python中,字典、列表字符串···都是对象

    • 类即类型

      lis = [1,2,3]

    • 类实例化产生对象

      ll=list([1,2,3])
      l2=list([5,7,8])

    • 类即类型

      list.append(ll,9)
      print(ll)
      
      print(type(ll))
      
      class Student:
          #变量表示属性
          school='oldboy'
          def choose(self):
              print("选课....")
          def study(self):
              print('学习')
      a=Student()
      print(type(a))
      

    五、小练习

    #人狗大战
    #定义一个狗类
    class Dog:
        type_dog='藏獒'
        def __init__(self,name,aggressivity,hp=100):
            self.name=name
            self.aggressivity=aggressivity
            self.hp=hp
        def bite(self,target):
            #当期狗的攻击力:self.aggressivity
            #人的血量:target.hp
            target.hp-=self.aggressivity
            print('''
            狗的品种:%s
            %s狗咬了一下%s人,
            人掉血:%s
            人的血量剩余:%s
            '''%(self.type_dog,self.name,target.name,self.aggressivity,target.hp))
    #人类
    class Human:
        def __init__(self,name,aggressivity,hp=100):
            self.name=name
            self.aggressivity=aggressivity
            self.hp=hp
        def bite(self,target):
            target.hp-=self.aggressivity
            print('''
            %s人咬了一下%s狗,
            狗掉血:%s
            狗的血量剩余:%s
            '''%(self.name,target.name,self.aggressivity,target.hp))
    
    
    #实例化产生狗对象
    # dog1=Dog('旺财',10)
    dog1=Dog('旺旺财',10,200)
    nick=Human('nick',50)
    dog1.bite(nick)
    print(nick.hp)
    dog1.bite(nick)
    print(nick.hp)
    nick.bite(dog1)
    
  • 相关阅读:
    多态问题----针对方法
    画了个Android——Canvas类的使用(转)
    设计模式之策略模式
    Listview多种布局的使用
    Activity的退出和進入效果
    java.lang.ClassNotFoundException
    台球小游戏
    线性表
    堆栈
    动态内存管理
  • 原文地址:https://www.cnblogs.com/1012zlb/p/11741313.html
Copyright © 2011-2022 走看看