51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 324|回复: 0
打印 上一主题 下一主题

[python] 高级编程之面向对象之Python

[复制链接]
  • TA的每日心情
    无聊
    昨天 08:59
  • 签到天数: 946 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-5-4 13:38:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    一、概述
      科班出身的同学应该学过C语言、C++或者Java,编程语言一般分为两种设计方式:面向过程编程、面向对象编程,早期的编程语言多数是面向过程的,像C语言就是面向过程编程,面向过程由多个过程组合在一起,也可以理解为函数编程,而Python在设计的时候就是一种面向对象编程的语言,其实python把面向对象简化了很多,如果学过java的同学再来学习python面向对象就会感觉非常简单。所以本篇文章就让我带着大家来学习一下什么是面向对象编程。

      二、面向对象的概念介绍
      类(Class)——用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
      类方法——类中定义的函数。
      类属性——属性就是类变量。
      方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
      实例变量——在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
      继承——即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
      实例化——创建一个类的实例,类的具体对象。
      对象——通过类定义的数据结构实例。对象包括两个数据成员:属性和方法。
      对象可以分为两个部分:一部分称为属性(变量),一部分称为行为(方法)。
      1)类定义
      语法格式如下:
      class ClassName:
          <statement-1>
          .
          .
          .
          <statement-N>


      示例如下:
      #!/usr/bin/python3

      class MyClass:
          """一个简单的类实例"""
          i = 12345
          def f(self):
              return 'hello world'

      # 实例化类
      x = MyClass()

      # 访问类的属性和方法
      print("MyClass 类的属性 i 为:", x.i)
      print("MyClass 类的方法 f 输出为:", x.f())


      2)类属性
      python类属性分为:私有属性和公开属性,python是没有什么修饰符的,像java就分的更细致,通过private(私有级)、protected(受保护级)、无前缀(默认级)、public(公开级)控制权限。
      私有属性(__private_attrs):两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
      公开属性(private_attrs):不带两个下划线开头,可以在类外访问,通过实例名访问,也可以在类中访问。
      示例如下:
      #!/usr/bin/python3

      class JustCounter:
          __secretCount = 0  # 私有变量
          publicCount = 0    # 公开变量

          def count(self):
              self.__secretCount += 1
              self.publicCount += 1
              print (self.__secretCount)

      counter = JustCounter()
      counter.count()
      counter.count()
      print (counter.publicCount)
      print (counter.__secretCount)  # 报错,实例不能访问私有变量


      3)类方法
      类方法也是分为:私有方法和公开方法,但是私有变量属性一把通过set/get公开方法操作。示例如下:
      class Parents(object):
          __name = "test"
          __age = 35

          # 设置姓名
          def set_name(self, name):
              self.__name = name

          # 获取姓名
          def get_name(self):
              return self.__name

          # 设置年龄
          def set_age(self, age):
              self.__age = age

          # 获取年龄
          def get_age(self):
              return self.__age
      if __name__ == "__main__":
          # 实例化
          p = Parents()
          # 调用公有方法去设置属性
          p.set_age(30)
          # 获取私有属性
          print(p.get_age())

          # 调用公有方法去设置属性
          p.set_name("zhangsan")
          # 获取私有属性
          print(p.get_name())


      【温馨提示】self 的名字并不是固定的,也可以使用 this,但是最好还是按照约定使用 self。
      4)构造方法(init)
      init : 构造函数,在生成对象时调用。
      示例如下:
      class Parents(object):
          __name = "test"
          __age = 35

          def __init__(self, name, age):
              self.__name = name
              self.__age = age

          # 设置姓名
          def set_name(self, name):
              self.__name = name

          # 获取姓名
          def get_name(self):
              return self.__name

          # 设置年龄
          def set_age(self, age):
              self.__age = age

          # 获取年龄
          def get_age(self):
              return self.__age
      if __name__ == "__main__":
          # 实例化
          p = Parents(25, "lisi")
          # 获取私有属性
          print(p.get_age())
          # 获取私有属性
          print(p.get_name())


      不单单有构建函数,还有其它专有的函数,都是自动去调用的:
      ·__init__ : 构造函数,在生成对象时调用
      · __del__ : 析构函数,释放对象时使用
      · repr : 打印,转换
      · setitem : 按照索引赋值
      · getitem: 按照索引获取值
      · len: 获得长度
      · cmp: 比较运算
      · call: 函数调用
      · add: 加运算
      · sub: 减运算
      · mul: 乘运算
      · truediv: 除运算
      · mod: 求余运算
      · pow: 乘方
      三、面向对象封装、继承和多态
      面向对象编程有三大特点:封装、继承和多态。
      1)封装
      就是将一个类的属性、方法全部包装到了一个类中。一般设置属性为私有的,通过方法去调用,当然有些方法只需要在类内部使用也是可以设置成私有的方法的,通过公开的方法来供外部间接调用这些“封装”好的属性和方法,这就是封装。
      其实上面的示例就是很好的证明,内部定义私有属性,外部通过公开的方法访问。
      class Parents(object):
          __name = "test"
          __age = 35

          def __init__(self, name, age):
              self.__name = name
              self.__age = age

          # 设置姓名
          def set_name(self, name):
              self.__name = name

          # 获取姓名
          def get_name(self):
              return self.__name

          # 设置年龄
          def set_age(self, age):
              self.__age = age

          # 获取年龄
          def get_age(self):
              return self.__age
      if __name__ == "__main__":
          # 实例化
          p = Parents(25, "lisi")
          # 获取私有属性
          print(p.get_age())
          # 获取私有属性
          print(p.get_name())


      2)继承
      继承就非常好理解了,其实通过字面意思理解就行了,一个类是另一个类的子类,那么这个类就可以拥有和父类一样的属性、方法。这就好比是现实当中,儿子继承父母的遗产一样。但是需要注意的是私有属性和私有方法是无法继承的,其它语言也是一样的。
      在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
      示例如下:
      class Animal(object):
          # 无法给继续子类
          __name = ""
          # 可以继承给子类
          color = ""
          def __init__(self, name, color):
              self.__name = name
              self.color = color
          # 可以继承给子类
          def set_name(self, name):
              self.__name = name
          def get_name(self):
              return self.__name
          def set_color(self, color):
              self.color = color
          # 无法给继续子类
          def __get_color(self):
              return self.color
      class Cat(Animal):
          def __init__(self, name, color):
              self.name = name
              self.color = color
              # 调用父类构造函数
              super(Cat, self).__init__(name, color)
              # Animal.__init__(name, color)
          # 重写父类方法
          def set_name(self, name):
              self.name = name
          # 重写父类方法
          def get_name(self):
              return self.name
      if __name__ == "__main__":
          c = Cat("小猫", "黑色")
          # 获取父类公开属性
          print(c.color)
          # 调用子类方法重写的方法
          c.set_name("大猫")


      多继承:所谓多继承意思就是一个类同时继承了多个父类
      示例如下:
      #类定义
      class people:
          #定义基本属性
          name = ''
          age = 0
          #定义私有属性,私有属性在类外部无法直接进行访问
          __weight = 0
          #定义构造方法
          def __init__(self,n,a,w):
              self.name = n
              self.age = a
              self.__weight = w
          def speak(self):
              print("%s 说: 我 %d 岁。" %(self.name,self.age))

      #单继承示例
      class student(people):
          grade = ''
          def __init__(self,n,a,w,g):
              #调用父类的构函
              people.__init__(self,n,a,w)
              self.grade = g
          #覆写父类的方法
          def speak(self):
              print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

      #另一个类,多重继承之前的准备
      class speaker():
          topic = ''
          name = ''
          def __init__(self,n,t):
              self.name = n
              self.topic = t
          def speak(self):
              print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))

      #多重继承
      class sample(speaker,student):
          a =''
          def __init__(self,n,a,w,g,t):
              student.__init__(self,n,a,w,g)
              speaker.__init__(self,n,t)

      test = sample("Tim",25,80,4,"Python")
      test.speak()   #方法名同,默认调用的是在括号中参数位置排前父类的方法


      3)子类重新方法和super()调用父类方法
      class Parent:        # 定义父类
         def myMethod(self):
            print ('调用父类方法')

      class Child(Parent): # 定义子类
         # 重新父类方法
         def myMethod(self):
            print ('调用子类方法')

      c = Child()          # 子类实例
      c.myMethod()         # 子类调用重写方法
      super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法


      4)多态
      多态首先是建立在继承的基础上的,先有继承才能有多态。多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须使用父类new子类的方式。
      示例如下:
      #!/usr/bin/env python3
      # -*- coding:utf-8 -*-
      class Person:
          def __init__(self, name, age):
              self.name = name
              self.age = age
          def print_age(self):
              print("%s's age is %s" % (self.name, self.age))
      class Man(Person):
          def print_age(self):
              print("Mr. %s's age is %s" %(self.name, self.age))
      class Woman(Person):
          def print_age(self):
              print("Ms. %s's age is %s" %(self.name, self.age))
      def person_age(person):
          person.print_age()
      if __name__ == "__main__":
          person = Person("kevin", 23)
          man = Man("Bob", 33)
          woman = Woman("Lily", 28)
          person_age(person)
          person_age(man)
          person_age(woman)


      【总结】其实多态也很好理解,就是将不同的对象传到相同的函数,表现不同的形态,这就是多态。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-11 01:40 , Processed in 0.060253 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表