美文网首页
006-面向对象1

006-面向对象1

作者: 痞子_4ae7 | 来源:发表于2020-05-14 11:48 被阅读0次

    面向过程与面向对象

    • 开车问题
    • 吃饭问题
    • 做饭问题

    类与对象

    • 类的概念
    将具有共同特征以及共同行为的一组对象进行抽象,抽象出来的东西,就有一个概念:类
    类就相当于制造盖楼使用的设计图
    
    • 对象的概念
    某一个具体的存在,看得见的,摸的着的
    例如:望京soho(猪腰子),中央电视台总部大楼(大裤衩)
    
    • 练习: 区分类与对象
    奥迪汽车
    张三停在车库的奥迪A8
    雅迪
    人
    咱班坐在xx的xx
    笔记本
    thinkPad
    小明的thinkPad
    
    • 类的组成
    类名
    属性:(静态) 一组数据
    方法:(动态)运行调用的函数
    
    • 设计练习
    封装人类:
    属性:年龄、性别、年龄
    行为:吃、睡、学习
    封装狗类:
    属性:品种、名字、颜色
    行为:叫、跑、睡觉
    
    • 抽象的练习
      • 王者荣耀团战图片面向对象分析
      • 绝地求生图片面向对象分析

    类的定义

    语法:
    class 类名:
    方法列表
    案例:
    class Person:
    # 自我介绍方法
        def introduce(self):
            print("我的名字叫:%s,今年%d岁了"%(self.name,self.age))
    注意:
    也有类似使用(新式类,手动指明了父类为谁)
    class Person(object):
    def xxxx():
    ....
    类的命名规则:
    大驼峰  Person、 Cat、Dog...
    

    创建对象

    封装好类,等于是画好了图纸,下边就
    可以开始根据图纸进行一座座楼房的建造了
    
    • 语法格式
    对象名 = 类名()
    p = Person()
    
    • 案例
    class Person:
        # 自我介绍方法
        def introduce(self):
            print("我的名字叫:%s,今年%d岁了"%(self.name,self.age))
    # p = Person('ss',12)
    # 创建对象
    p = Person()
    # 添加属性,并给属性赋值
    p.name = '陈独秀'
    # 如果在这调用方法,会报错,因为在方法的调用中,访问了age属性,但是,目前对象中还没有该属性
    # p.introduce()
    # 添加属性,并给属性赋值
    p.age = 30
    # 调用对象的方法
    p.introduce()
    
    注意:
    对象包含属性和方法两部分
    第一次p.name 是给对象添加属性,之后再访问,则是修改属性的值
    

    init方法

    • init引入
    每次创建对象,都需要手动添加属性,创建多个对象,这些操作要进行多次,
    有没有简便的方式,创 建每一个对象,都自动包含了这些属性
    答案: 有,__init__方法的使用
    
    • init方法的使用
    class Dog:
    # 创建对象时,该方法会被默认调用(代码验证)
        def __init__(self):
            self.name='大黄'
            self.age = 2
        def showInfo(self):
            print('name:%s,age:%d'%(self.name,self.age))
    # 创建对象之后,没有手动添加属性
    dog = Dog()
    # 调用对象方法没有报错,说明已经对象中已经包含了name跟age两个属性
    dog.showInfo()
    
    思考:
    属性的值是固定的,能不能创建对象时,
    直接完成赋值,答案,可以,见 5.3
    
    • 自定义参数的使用
    class Dog:
    #给__init__方法增加参数,第一个self为默认参数,python解释器自动传递值
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def showInfo(self):
            print('name:%s,age:%d'%(self.name,self.age))
    # '大黄'与 2分别是name与age的实际参数
    dog = Dog('大黄',2)
    dog.showInfo()
    
    • 练习:
    完成一个Student类的封装,包含属性:name,age,gender 方法:study(),eat()
    创建对象并直接赋值(通过__init__方法完成),调用方法测试
    
    • magic方法

      在python中,有一些内置好的特定的方法,这些方法在进行特定的操作时会自动被调用,称之为魔法方法
      
      • 打印id
      class Dog:
          def __init__(self,name,age):
              self.name = name
              self.age = age
          def showInfo(self):
              print('name:%s,age:%d'%(self.name,self.age))
      dog = Dog('大黄',2)
      print(dog)
      打印结果:
      <__main__.Dog object at 0x0000000002839E10>
      
    • 定义str()方法

    class Dog:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def showInfo(self):
            print('name:%s,age:%d' % (self.name, self.age))
        def __str__(self):
            # 使用'+'只能拼接字符串
            message = "我的名字:" + self.name + ",我的年龄:" + str(self.age)
            return message
    dog = Dog('大黄', 2)
    # dog.showInfo()
    # 这时候会打印__str__方法中return的数据
    print(dog)
    

    self 关键字的使用

    • 表示意义:
    可以理解为自己,类似与Java、C++中的this指针,表示对象自身
    注意:
    某个对象调用方法时,python解释器会把这个对象做为第一个参数,传递给self,也就是
    哪个对象调用该方法,self表示的是谁
    
    • 用法:

      • 添加/访问属性
      • 访问当前类中的其他方法
      见案例:
      class Dog:
          def __init__(self,name,age):
              # self作用,访问/添加属性
              self.name = name
              self.age = age
          def showInfo(self):
              print("name:%s,age:%d"%(self.name,self.age))
              # 直接访问当前类中其他方法会报错
              # shout()
              # 访问当前类中的其他对象方法
              self.shout()
          def shout(self):
              print("汪汪汪~")
      
      # 定义一个函数
      def printDog(dog):
          # 判断dog为Dog的类的对象(做容错处理,防止函数调用直接给一个字符串参数抛出异常)
          if isinstance(dog,Dog):
              print("是dog对象")
              # 函数中调用Dog类中的方法
              dog.showInfo()
      # 创建对象
      dog1 = Dog('大黄',2)
      dog2 = Dog('小黑',1)
      # 调用函数
      printDog(dog1)
      printDog(dog2)
      # 如果没有使用  isinstance(对象,所属类),这行代码会导致报错
      printDog("123")
      

    隐藏数据(属性私有)

    • 修改属性的方式

      • 直接修改
      • 间接修改(通过方法修改)
      class Hero:
          def __init__(self,name,gender,age):
              # self.__name = name
              self.setName(name)
              self.__gender = gender
              # self.__age 可以将属性保护起来,类的外部无法访问
              # self.__age = age
              self.setAge(age)
          def setName(self,name):
              self.__name = name
          def setAge(self,age):
              if age > 0:
                  self.__age = age
              else:
                  print("年龄不合理,设置默认年龄1")
                  self.__age = 1
          def __str__(self):
              return  'class:Hero'+'['+self.__name+','+self.__gender+','+str(self.__age)+']'
      h1 = Hero('陈独秀','男',-100)
      # 直接修改不合理,可以给任意值
      # 属性保护之后,无法通过直接访问的方式进行访问,有利于数据安全
      h1.age = -200
      print(h1)
      

    面向对象练习之回合制小游戏

    • 面向对象练习
    类的封装: 普通攻击,跟技能攻击,
    技能需要封装新的类
    随机模块的使用 
    import random
    

    相关文章

      网友评论

          本文标题:006-面向对象1

          本文链接:https://www.haomeiwen.com/subject/heftohtx.html