Python基础-面向对象(1)

python的面向对象

  • 面向对象编程

    • 基础
    • 私有
    • 继承
    • 组合,Minxi
  • 魔法函数

    • 魔法函数概述
    • 构造类魔法函数
    • 运算类魔法函数
  • 面向对象概述
    • OOP的思想
      • 接触到任意一个任务,首先想到的是任务这个世界的狗成,是由模型构成的
      • 类就是模型
      • 类中的方法就是模型的功能
    • 几个名词
      • OO:面向对象
      • OOA:面向对象的分析
      • OOD:面向对象的设计
      • OOI:面向对象的实现
      • OOP:面向对象的编程
      • OOA->OOD->OOI:面向对象的实现过程
    • 类和对象的概念
      • 类:抽象名词,代表一个集合,共性的事物
      • 对象:具象的事物,单个个体
      • 类和对象的关系
        • 一个具象,代表一类事物的某一个个体
        • 一个是抽象,代表的是一大类事物
    • 类的内容,应该具有两个内容
      • 表明事物的特征,叫做属性
      • 表明事物的功能或动作,称为成员方法
  • 类的基本实现
    • 类的命名

      • 遵守变量命名的规范
      • 大驼峰命名(由一个单词或者多个单词构成,首字母大写)
      • 尽量避免跟系统命名相似的命名
    • 如何声明一个类

      • 必须用class关键字

      • 类由属性和方法构成,其他不允许出现

      • 成员属性定义可以直接使用变量赋值,如果没有值,允许使用None

      • 访问成员对象

        • 使用点操作符
          • obj.成员属性名称
          • obj.成员方法
        • 可以通过默认内置变量检查类和对象的所有成员
          • 对象所有成员检查
            • obj._dict
          • 类的所有成员检查
            • class_name._dict
        '''
        
        定义一个学生类,用来形容学生
        
        '''
        
        class Student():
        #一个空类,pass代表跳过
        #pass必须有
           pass
        
        #定义一个对象
        zs = Student()
        
        #再定义一个类,用来描述听Python的学生
        class PythonStudent():
            name = None
            age = 19
            course = "Python"
        
            def doHomeWork(self):
                print(self.name)
                print("我在写作业")
                #推荐在函数末尾使用return返回
                return None
        
            def goHome(self):
                print("我要回家啦")
                return None
        
        #实例化一个对象,具有具体的功能
        yueyue = PythonStudent()
        yueyue.name = "yueyue"
        yueyue.doHomeWork()
        #类和对象的成员检测
        yueyue.__dict__
        PythonStudent.__dict__
        
  • 类和对象的成员分析
    • 类和对象都可以存储成员,成员可以归类所有,也可以归对象所有

    • 类存储成员时使用的是与类关联的一个对象

    • 独享存储成员是存储在当前对象中

    • 对象访问一个成员时,如果对象中没有该成员,尝试访问类中的同名成员,如果对象中有此成员,一定使用对象中的成员

    • 创建对象的时候,类中的成员不会放入对象中而是得到一个空对象,没有成员

    • 通过对象对类中成员重新赋值或者通过对象添加成员时,对应成员会保存在对象中,而不会修改类成员

      class A():
          name = "A"
          pass
      #获取A中name的值
      print(A.name)
      #打印出A.name指向的内存地址
      print(id(A.name))
      #实例化一个A的对象
      a = A()
      #打印出a中name的值
      print(a.name)
      #打印出a.name指向的内存地址
      print(id(a.name))
      #判断两个id是否相等
      if id(a.name) == id(A.name):
          #如果两个id是相等的,那么就将a.name赋值为b
          a.name = "b"
          #接着判断两个id是否相等
          if id(a.name) != id(A.name):
              #经过上面的赋值如果两个id不相等,就进入到这里面
              print("进入到这里面就说明,在给a这个对象赋值的时候,"
                    "python又重新给a分配了一块内存空间现在a不是和A指向的同一个实例,"
                    "这就得出了结论'对象访问一个成员时,如果对象中没有该成员,尝试访问类中的同名成员,如果对象中有此成员,一定使用对象中的成员'")
      else:
          print("两个内存地址不相等")
      
  • self
    • self在对象的方法中表示当前对象本身,如果通过对象调用一个方法,那么该对象会自动传入到当前方法的第一个参数中
    • self不是关键字,只是一个用于接收对象的普通参数,理论上可以用任何一个普通变量名代替
    • 方法中有self形参的方法成为非绑定类的方法方法,可以通过对象访问,没有self的是绑定类的方法,只能通过类访问
    #self案例
    class A():
        #创建一个有self的方法
        def aA(self):
            print("这里是aA")
        #创建一个没有self的方法
        def bB():
            print("这里是bb")
    #实例化a
    a = A()
    #访问A类中的aA方法,aA方法是有self参数的,默认将a作为参数,传进去
    a.aA()
    #访问A类中的bB方法,bB方法是没有self参数的,如果通过对象a进行调用的话,会默认将a作为参数传进去,会报错
    #如果使用类实例来调用的话,直接调用的是A.bB()不需要传入任何参数
    A.bB()
    
    • 使用类访问绑定类的方法时,如果类方法中需要访问当前类的成员,可以通过____class___.成员名来访问

      #访问参数案例
      class B():
          b = "b"
          def b1(self):
              #将传入对象的b属性重新赋值为"B"
              self.b = "B"
              print(self.b)
      
          def b2(self):
             self.b = "a"
             #直接通过__class__.b来访问类中成员的数据
             print(__class__.b)
      
      b = B()
      b.b1()
      b.b2()
      
    • 鸭子模型

      • 在python中,如果A类拥有和B类一样的方法,当有一个函数调用B类,并利用到B类的方法,我们传入的A类一样可以运行,函数不会检查对象的类型是不是A类,只要A类拥有B类的方法和属性,就可以正确的被调用

        #鸭子模型
        class Duck():
            name = "鸭子"
            #鸭子的翅膀是黄色
            wing = "黄色"
            #鸭子会游泳
            def swimming(self):
                print("我是一只{0},我会游泳".format(self.name))
        
        class Angel():
            name = "天使"
            wing = "白色"
            def swimming(self):
                print("我是{0},我会游泳".format(self.name))
        
            def fly(self):
                print("我是天使我,会飞")
        
        du = Duck()
        #将对象本身传值进去
        du.swimming()
        #直接使用类实例调用鸭子会飞的方法,但是将对象a作为值放进去
        Duck.swimming(du)
        #直接使用类实例调用鸭子会飞的方法,但是将angle类实例,作为对象传进去
        Duck.swimming(Angel())
        

你可能感兴趣的:(Python基础,python)