Python之面对对象编程

一)面向对象

面向对象(Object Oriented)是一种软件开发方法。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物,它的提出是相对于面向过程来讲的。
面向对象程序设计(Object Oriented Programming)方法是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界、解决现实问题的方法和过程,也即使得描述问题的问题空间与问题的解决方案空间在结构上尽可能一致,把客观世界中的实体抽象为问题域中的对象。
面向对象和面向过程的区别是:

  • 面向过程是一种以过程为中心的编程思想;面向对象是一种以对象为核心的编程思想。
  • 面向过程是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现;面向对象是把构成问题事务分解成各个对象,然后对每一个对象进行操作来实现。
  • 面向过程的核心是函数;面向过程的核心是类和对象。

面对对象的主要概念:

  • 数据抽象
  • 对象
  • 继承
  • 多态性
  • 消息传递
  • 数据封装
  • 动态绑定

二)类和对象

面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成。类是对现实世界的抽象,包括表示静态属性的数据和对数据的操作,对象是类的实例化。对象间通过消息传递相互通信,来模拟现实世界中不同实体间的联系。在面向对象的程序设计中,对象是组成程序的基本模块。
Python语言从设计之初就已经是一门面向对象的语言,因此Python中创建类和对象是很容易的。

1. 类的定义

类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)中的概念,是面向对象编程的基础。类是一群物种的整体名称,例如人类、动物类、植物类等等,在编程语言中类是一种用户定义的引用数据类型,也称类类型,类似于byte、short、int(char)、long、float、double等基本数据类型,不同的是它是一种复杂的数据类型。它是具有相同或相似性质的对象的抽象,本质是数据类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。
类的定义包括:

  1. 类名-类的名称,通常情况下首字母使用大写字母,以区分类名与其他变量名
  2. 属性-用于描述事物的特征,例如狗的种类、颜色等特征
  3. 方法-用于描述事物的行为,例如狗的叫声、奔跑等行为

在Python中,使用class关键字定义一个类,其基本语法格式如下:

 class 类名:   
      类的属性   
      类的方法 

如:定义一个狗类,代码为:

 class Dog   
            #属性  
            #方法  
           def eat(self):      
                  print(‘狗喜欢吃肉!’) 

2. 对象的创建

类是一群具有相同特征的事物,是不能具体指向某个东西的,而对象就是类的具体化,是类中具体的某个实物,所以说类是对象的抽象,对象是类的具体。类的属性和方法是不能实现的,只有具体到对象才能实现。 Python语言中,创建对象的基本语法格式是:

对象名=类名()

3.构造方法和析构方法

在Python程序中,有两个特殊的方法,分别是构造方法_init_()和析构方法_del_()。构造方法用于初始化对象的属性,析构方法用于释放类和对象所占用的空间。构造方法和析构方法都是由编译器隐式调用的。这些方法的调用顺序取决于程序的执行进入和离开实例化对象时所在的那个作用域的顺序。一般而言,析构方法的调用顺序和构造方法的调用顺序相反,但是,对象的存储类可以改变析构函数的调用顺序。

a.构造方法

构造方法具有初始化的作用,也就是当该类被实例化的时候就会执行该方法,也就是当一个对象被创建后,会立即调用构造方法。
Python类中,手动添加构造方法的语法格式如下:

def  __init__(self,...):
    代码块
b.析构方法

当对象使用完以后需要删除的时候,Python语言就会释放类所占用的资源,此时Python解释器会默认调用一个析构方法。析构方法是当对象在内存中被释放时,自动触发执行。此方法一般无需定义,因为python 是一门高级语言,程序员在使用时无需关心内存的分配和释放,析构方法的调用是由解释器在进行垃圾回收时是自动触发执行的。
Python 类中,手动添加析构方法的语法格式如下:

 def  __del__(self):
    代码块
c.构造方法和析构方法的注意问题:
  • 构造方法和析构方法的方法名中,开头和结尾各有一个下划线,且中间不能有空格。
  • 在Python语言中,如果不手动创建一个构造方法,系统会自动为类添加一个仅包含 self 参数的构造方法。
  • 在Python语言中,析构方法也是可以省略的,因为Python有一个垃圾收集器,可以自动处理内存管理。

4. self 的使用

在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法。

扫描二维码关注公众号,回复: 16480546 查看本文章

三)面对对象的三大特性

1.封装

封装,顾名思义就是将某些不想让别人随便修改的东西包装起来,别人只能看到包装的外表并且只能通过外表提供的接口进行操作,而不需要知道内部的原理并且不能直接修改内部的东西。
在面向对象的编程语言中,封装就是将不想让外部随意修改的属性进行隐藏,仅对外公开接口,这样在使用此类时,将无法直接以“类对象.属性名”的形式调用这些属性,而只能用未隐藏的类方法间接操作这些隐藏的属性,以达到控制在程序中属性的读和修改的访问级别的目的。
Python 类中的变量和方法,不是公有的(类似 public 属性),就是私有的(类似 private),这两种属性的区别如下:

  • public:公有属性的类变量和类方法,在类的外部、类内部以及子类(后续讲继承特性时会做详细介绍)中,都可以正常访问;
  • private:私有属性的类变量和类方法,只能在本类内部使用,类的外部以及子类都无法使用。

Python没有提供 public、private 这些修饰符。为了实现类的封装,Python 采取了下面的方法:

  • 默认情况下,Python 类中的变量和方法都是公有(public)的,它们的名称前都没有下划线(_);
  • 如果类中的变量和方法,其名称以双下划线“__”开头,则该变量(方法)为私有变量(私有方法),其属性等同于private。

2. 继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。现实生活中,子女可以继承父母的遗产,面向对象中的继承跟这个类似,就是一个类可以直接使用另一个类的属性和方法,而不需要重新定义。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,一般称“父类”。
Python语言的继承有单继承和多继承两种。

a.单继承

单继承就是一个类只能有一个父类,也就是只能继承自一个类,不能同时继承多个类,但是一个父类可以同时有多个子类。
单继承是继承中比较常用的一种继承,单继承的基本语法格式如下:

  class 子类名(父类名)
                      子类代码块

单继承的结构图:
image.png

b.多继承

与Java语言不用,Python语言可以实现多继承。例如:一个在职学生,他既是学生,又是工人,也就是既具有学生的属性和方法,又具有工人的属性和方法,因此可以说他有两个父类,此时让他同时继承学生类和工人类即可,这就是多继承。 多继承的基本语法格式如下:

class 子类名(父类1,父类2……)
                      子类代码块

多继承的结构图:
image.png

c.覆盖和重写

在继承关系中,子类自动继承父类的属性和方法,但是有些时候子类继承过来的属性和方法需要有自己的名字和实现方式,此时可以在子类中对父类的属性和方法进行重新赋值或者重新写入。一般属性的重新赋值叫覆盖,方法的重新写入叫重写。覆盖和重写时注意,子类需要覆盖的属性名称必须与父类的属性名完全相同,子类需要重写的方法名和参数列表必须与父类的方法名和参数列表完全相同。

3.多态

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,多态就是可以使用相同的方法名实现不同的功能,就是说可以用一个方法名调用不同内容(功能)的方法。Python的多态性是指:在不考虑实例类型的情况下使用实例,也就是说不同类型的实例有相同的调用方法,比如人、猫、狗等等只要是继承了Animal就可以直接调用它的move()方法。

  • 多态的特点有:
  • 只关心对象的实例方法是否同名,不关心对象所属的类型;
  • 对象所属的类之间,继承关系可有可无;
  • 多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
  • 多态是调用方法的技巧,不会影响到类的内部设计。

四)类属性和类方法

Python 语言中一切皆是对象:class AAA: 定义的类属于类对象,obj1 = AAA() 创建的对象属于实例对象。使用类创建出来的对象叫做类的实例,创建对象的动作叫做实例化,对象的属性叫做实例属性,对象调用的方法叫做实例方法。在程序执行时,对象各自拥有自己的实例属性,调用自己的实例方法,可以通过self访问自己的属性和调用自己的方法。在 Python 中,类是一个特殊的对象—— 类对象,在程序运行时,类同样会被加载到内存,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例,除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法,称为类属性和类方法,通过类名. 的方式可以访问类的属性或者调用类的方法。

1. 类属性

类属性就是类所拥有的属性,通常用来记录与这个类相关的特征,类属性不会用于记录具体对象的特征。类属性需要在类中显式的定义(位于类中所有方法的外部,定义在方法内部的属性是实例属性),能被类的所有实例共用。定义类属性的基本格式如下:

class 类名:
                类属性
                def 方法名():
                         实例属性

类属性既可以使用类名访问,也可以使用实例名访问,但是一般情况下我们提倡使用类名访问类属性。原因如下:

  • 使用实例名访问类属性时,可能会出现你不想要的结果。
  • 如果出现类属性和实例属性具有相同名称,那么访问类属性只能使用类名,如果使用实例名则访问到的是实例属性。

2. 类方法

类方法就是针对类对象定义的方法,在类方法内部可以直接访问类属性或者调用其他的类方法。其基本语法格式如下:

class 类名:
                       @classmethod
                       def 类方法名(cls):
                                 方法体

类方法需要用修饰器@classmethod来标识,告诉解释器这是一个类方法。类方法的第一个参数应该是 cls,由哪一个类调用的方法,方法内的 cls 就是哪一个类的引用,这个参数和实例方法的第一个参数是 self 类似(使用其他名称也可以,不过习惯使用 cls)。通过“类名. 类方法”名来调用类方法,调用方法时不需要传递 cls 参数,在方法内部,可以通过 “cls.属性”来访问类的属性,也可以通过 “cls.方法”调用其他的类方法。既可以通过类名调用类方法,也可以通过对象名调用类方法,这两种方式是一样的。

猜你喜欢

转载自blog.csdn.net/xiaoyu070321/article/details/132298492
今日推荐