面向对象程序设计(一)

(一)面向对象概述

  • 对象:事物存在的实体由静态属性和动态行为组成
  • 类:具有相同属性和行为的对象的集合

面向对象程序设计的特点:

  • 面向对象程序设计具有三大基本特征:封装、继承和多态

(1)封装:

  • 封装是面向对象编程的核心思想,利用类将对象的属性和行为封装起来。
  • 采用封装思想保证了内部数据结构的完整性,使用该类的用户不能直接看到类中的数据结构,而只能执行类允许公开的数据,这样就避免了外部对内部数据的影响,提高了程序的可维护性。

(2)继承:

  • 继承是实现重复利用的重要手段,子类通过继承复用了父类的属性和行为的同时,又添加了子类特有的属性和行为。

(3)多态:

  • 将父类对象应用于子类的特征就是多态,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同效果

(二)类的定义和使用

(1)定义类

语法:

class ClassName:
   '''类的帮助信息'''     #类文档字符串
   statement             #类体
  • ClassName:用于指定类名,采用驼峰式命名法
  • ‘’‘类的帮助信息’’’:用于指定类的文档字符串,定义该字符串后,在创建类的对象时,
    输入类名和左侧的括号”(“后,显示该信息
  • statement:类体,主要由类变量(或类成员)、方法和属性等定义语句组成

创建大雁类

class Geese:
    '''大雁类'''
    pass

(2)创建类的实例

语法:

ClassName=(parameterlist)
  • ClassName:必选参数,用于指定具体的类
  • parameterlist:可选参数,当创建一个类时,没有创建__init__()方法,或者__init__()方法只有一个self参数时,parameterlist参数可以省略

创建大雁类的一个实例

wildGoose = Geese()
print(wildGoose)

结果表明,wiidGoose是Geese类的实例

<__main__.Geese object at 0x000001ED2752C208>

Process finished with exit code 0

(3)创建__init__()方法

  • 在创建类后,通常会创建一个__init__()方法。该方法是一个特殊方法,类似于Java语言中的构造函数
  • 每当创建一个类的新实例时,Python都会自动执行它。
  • init()方法必须包含一个self参数,并且必须是第一个参数。self参数是一个指向实例本身的引用,用于访问类中的属性和方法。
  • 在方法调用时会自动传递实际参数self。因此,当__init__()方法只有一个参数时,在创建类的实例时,就不需要指定实际参数了。

在创建大雁类的实例时,虽然没有为__init__()方法指定参数,但是该方法会自动执行

class Geese:
    '''大雁类'''
    def __init__(self):     #构造方法
        print('我是大雁类')
wildGoose = Geese()         #创建大雁类的实例
我是大雁类

Process finished with exit code 0

常见错误:在为类创建__init__()方法时,遗漏self参数

class Geese:
    '''大雁类'''
    def __init__():     #构造方法
        print('我是大雁类')
wildGoose = Geese()         #创建大雁类的实例
TypeError: __init__() takes 0 positional arguments but 1 was given

Process finished with exit code 1

在__init__()方法中,除了self参数外,还可以自定义一些参数,参数见使用逗号“,”进行分隔。

#__init__()方法中除了self参数之外,设置其他自定义参数
class Geese:
    '''大雁类'''
    def __init__(self,beak,wing,claw):     #构造方法
        print('我是大雁类!我有以下特征:')
        print(beak)                        #输出喙的特征
        print(wing)                        #输出翅膀的特征
        print(claw)                        #输出爪子的特征
beak_1 = '喙的基部较高,长度和头部的长度几乎相等' #喙的特征
wing_1 = '翅膀长而尖'                        #翅膀的特征
claw_1 = '爪子是蹼状的'                      #爪子的特征
wildGoose = Geese(beak_1,wing_1,claw_1)    #创建大雁类的实例
我是大雁类!我有以下特征:
喙的基部较高,长度和头部的长度几乎相等
翅膀长而尖
爪子是蹼状的

Process finished with exit code 0

(三)创建类的成员并访问

类的成员主要由实例方法数据成员组成。在类中创建了类的成员以后,可以通过类的实例进行访问。

(1)创建实例方法并访问

  • 所谓实例方法,是指在类中定义的函数。该函数是一种在类的实例上操作的函数。
  • 同__init__()方法一样,实例方法的而第一个参数必须是self,并且必须包含一个self参数。

语法:

def functionName(self,parameterlist):
    block
  • functionName:用于指定方法名,一般使用小写字母开头

  • self:必要参数,用于表示类的实例,其名称可以是self以外的单词,使用self只是一个习惯而已

  • block:方法体,实现的具体功能

  • 实例方法和Python中函数的主要区别就是:
    函数实现的是某个独立的功能,而实例方法是实现类中的一个行为,是类的一部分

实例方法完成创建后,可以通过类的实例名称和点(.)操作符进行访问

语法:

instanceName.functionName(parameterlist)
  • instance:类的实例名称
  • functionName:要调用的方法名称
  • parameterlist:表示为方法指定对应的实际参数,其值的个数与创建实例方法中parameterlist的个数相同
#创建大雁类并定义飞行方法
class Geese:                                               #创建大雁类
    '''大雁类'''
    def __init__(self,beak,wing,claw):                     #构造方法
        print(beak)                                        #输出喙的特征
        print(wing)                                        #输出翅膀的特征
        print(claw)                                        #输出爪子的特征
    def fly(self,state):                                    #定义飞行方法
        print(state)
print('---------------------调用方法--------------------------')
beak_1 = '喙的基部较高,长度和头部的长度几乎相等'                  #喙的特征
wing_1 = '翅膀长而尖'                                         #翅膀的特征
claw_1 = '爪子是蹼状的'                                       #爪子的特征
wildGoose = Geese(beak_1,wing_1,claw_1)                     #创建大雁类的实例
wildGoose.fly('我飞行的时候,一会儿排成个人字,一会儿排成个一字')    #调用实例方法
---------------------调用方法--------------------------
喙的基部较高,长度和头部的长度几乎相等
翅膀长而尖
爪子是蹼状的
我飞行的时候,一会儿排成个人字,一会儿排成个一字

Process finished with exit code 0

(2)创建数据成员并访问

  • 数据成员是指在类中定义的变量,即属性,根据定义位置,又可以分为类属性和实例属性

类属性

  • 类属性是指定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值,也就是在所有实例化的对象中公用。

  • 类属性可以通过类名称或者实例名访问

#定义一个大雁类Geese,在该类中定义三个属性
class Geese:
    '''大雁类'''
    neck = '脖子较长'                   #定义类属性(脖子)
    wing = '振翅频率高'                 #定义类属性(翅膀)
    leg = '腿位于身体的中心支点,行走自如'  #定义类属性(腿)
    def __init__(self):                #实例方法(相当于构造方法)
        print('我属于大雁类!我有以下特征:')
        print(Geese.neck)               #输出脖子的特征
        print(Geese.wing)               #输出翅膀的特征
        print(Geese.leg)                #输出腿的特征

geese = Geese()                         #实例化一个大雁类的对象
我属于大雁类!我有以下特征:
脖子较长
振翅频率高
腿位于身体的中心支点,行走自如

Process finished with exit code 0

类属性在类的所有实例之间共享值

#通过类属性统计类的实例个数
class Geese:
    '''大雁类'''
    neck = '脖子较长'                   #定义类属性(脖子)
    wing = '振翅频率高'                 #定义类属性(翅膀)
    leg = '腿位于身体的中心支点,行走自如'  #定义类属性(腿)
    number = 0                         #编号
    def __init__(self):                #构造方法
        Geese.number += 1              #将编号加1
        print('\n我是第'+str(Geese.number)+'只大雁,我属于大雁类!我有以下特征:')
        print(Geese.neck)               #输出脖子的特征
        print(Geese.wing)               #输出翅膀的特征
        print(Geese.leg)                #输出腿的特征

#创建四个大雁类的对象(相当于有四只大雁)
list1 = []
for i in range(4):                     #循环4次
    list1.append(Geese())                #创建一个大雁类的实例
print('\n一共有'+str(Geese.number)+'只大雁')
我是第1只大雁,我属于大雁类!我有以下特征:
脖子较长
振翅频率高
腿位于身体的中心支点,行走自如

我是第2只大雁,我属于大雁类!我有以下特征:
脖子较长
振翅频率高
腿位于身体的中心支点,行走自如

我是第3只大雁,我属于大雁类!我有以下特征:
脖子较长
振翅频率高
腿位于身体的中心支点,行走自如

我是第4只大雁,我属于大雁类!我有以下特征:
脖子较长
振翅频率高
腿位于身体的中心支点,行走自如

一共有4只大雁

Process finished with exit code 0

在Python中除了可以通过类名称访问类属性,还可以动态地为类和对象添加属性

Geese.beak = '喙的基部较高,长度和头部的长度几乎相等'  #添加类属性
print('\n第二只大雁的喙:',list1[1].beak)          #访问类属性

第二只大雁的喙: 喙的基部较高,长度和头部的长度几乎相等

Process finished with exit code 0

除了可以动态地为类和对象添加属性,也可以修改类属性。修改结果将作用于该类的所有实例

实例属性

实例属性是指定义在类的方法中的属性,只作用于当前实例中

#定义一个大雁类,在__init__()方法中定义是3个实例属性
class Geese:
    '''大雁类'''
    def __init__(self):                     # 实例方法(相当于构造方法)
        neck = '脖子较长'                     # 定义实例属性(脖子)
        wing = '振翅频率高'                   # 定义实例属性(翅膀)
        leg = '腿位于身体的中心支点,行走自如'    # 定义实例属性(腿)
        print('我属于大雁类!我有以下特征:')
        print(Geese.neck)                  # 输出脖子的特征
        print(Geese.wing)                  # 输出翅膀的特征
        print(Geese.leg)                   # 输出腿的特征

geese = Geese()                            #实例化一个大雁类对象

实例属性只能通过实例名访问,如果通过类名访问实例属性,将抛出如下异常

AttributeError: type object 'Geese' has no attribute 'neck'

Process finished with exit code 1

实例属性也可以通过实例名称修改,与类属性不同,通过实例名称修改实例属性后,并不影响该类的其他实例中相应的实例属性的值

#定义一个大雁类,并在__init__()方法中定义一个实例属性,然后创建两个Geese的实例,并且修改第一个实例的实例属性
class Geese:
    '''大雁类'''
    def __init__(self):                     #实例方法(相当于构造方法)
        self.neck = '脖子较长'                #定义实例属性(脖子)
        print(self.neck)                     #输出脖子的特征
goose1 = Geese()                             #创建Geese类的实例1
goose2 = Geese()                             #创建Geese类的实例2
goose1.neck = '脖子没有天鹅的长'                #修改实例属性
print('goose1的neck属性:',goose1.neck)
print('goose2的实例属性:',goose2.neck)
脖子较长
脖子较长
goose1的neck属性: 脖子没有天鹅的长
goose2的实例属性: 脖子较长

Process finished with exit code 0

本文地址:https://blog.csdn.net/ShengXIABai/article/details/113944819