欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python基础语法 面向对象程序设计(一)

程序员文章站 2023-02-21 22:39:23
面向对象程序设计(一)(一)面向对象概述对象:事物存在的实体由静态属性和动态行为组成类:具有相同属性和行为的对象的集合面向对象程序设计的特点:面向对象程序设计具有三大基本特征:封装、继承和多态(1)封装:封装是面向对象编程的核心思想,利用类将对象的属性和行为封装起来。采用封装思想保证了内部数据结构的完整性,使用该类的用户不能直接看到类中的数据结构,而只能执行类允许公开的数据,这样就避免了外部对内部数据的影响,提高了程序的可维护性。(2)继承:继承是实现重复利用的重要手段,子...

面向对象程序设计(一)

(一)面向对象概述

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

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

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

(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

相关标签: Python基础语法