《零基础学python》---第七章 面向对象程序设计

面对对象概述

对象

对象是一个抽象概念,英文称作“Object”,表示任意存在的事物。
在python中,一切都是对象。即不仅是具体的事物称为对象、字符串、函数等也都是对象。

 类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类。

面向对象程序设计的特点

面向对象程序设计具有三大基本特征:封装、继承和多态。
1.封装
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类,类通常会对客户隐藏其实现细节,这就是封装的思想。
采用封装思想保证了类内部数据结构的完整性,使用该类的用户不能直接看到类中的数据结构,而只能执行类允许公开的数据,避免了外部对内部数据的影响,提高了程序的可维护性。
2.继承
继承是实现重复利用的重要手段,子类通过继承复用了父类的属性和行为的同时又添加了子类特有的属性和行为。
3.多态
将父类对象应用于子类的特征就是多态。类衍生不出不同的子类,子类继承父类的同时,也具备自己的特征,并且能够实现不同的效果,这就是多态化的结构

类的定义和应用

定义类

在python中,类的定义使用class关键字来实现,语法如下:

class ClassName:
     '''类的帮助信息'''        #类文档字符串
     statement                #类体

ClassName:用于指定类名,一般使用大写字母开头,如果类名中包括两个单词,第二个单词的首字母也大写,这种命名方法也称为“驼峰式命名法”。也可以根据自己的习惯命名,但是一般推荐按照惯例来命名。
’’‘类的帮助信息’’’:用于指定类的文档字符串,定义该字符串后,在创建类的对象时输入类名和左侧的括号“(”后,将显示该信息。
statement:类体,主要由类变量(或类成员)、方法和属性等定义语句组成。如果在定义类时,没想好类的具体功能,也可以在类体中直接使用pass语句代替。

创建__init__()方法

在创建类后,可以手动创建一个__init__()方法。每当创建一个类的新实例时,Python都会自动执行它__init__()方法必须包含一个self参数,且必须是第一个参数。self参数是一个指向实例本身的应用,用于访问类中的属性和方法。在方法调用时会自动传递实际参数self,因此当__init__()方法只有一个参数时,在创建类的实例时,就不需要指定实际参数了。

class Geese:
    '''大雁类'''
    def __init__(self):
        print("我是大雁!")
wildGoose = Geese()

运行上面代码,会输出:我是大雁!
在__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)       #创建大雁类的实例

运行上面代码,会输出:

我是大雁!我有以下特征:
喙的基部较高,长度和头部几乎相等
翅膀长而尖
爪子是蹼状的

创建类的成员并访问

类的成员主要由实例方法和数据成员组成。在类中创建了类的成员后,可以通过类的实例进行访问。
1.创建实例方法并访问
所谓实例方法是指在类中定义的函数。该函数时一种在类的实例上操作的函数。同__init__()方法一样,实例方法的第一个参数必须是self,并且必须包含一个self1参数。

def functionName (self,parameterlist)
    block

functionName:用于指定方法名,一般使用小写字母开头。
self:必要参数,表示类的实例,其名称可以是self以外的单词。
parameterlist:用于指定除self参数以外的参数,各参数间使用逗号“,”进行分隔。
block:方法体,实现的具体功能。

class Geese:
    '''大雁类'''
    def __init__(self,beak,wing,claw):           #构造方法
        print("我是大雁!我有以下特征:")
        print(beak)                           #输出喙的特征
        print(wing)                           #输出翅膀的特征
        print(claw)                           #输出爪子的特征
    def fly(self,state):                      #定义飞行方法
        print(state)
        
beak_1="喙的基部较高,长度和头部几乎相等"        #喙的特征  
wing_1="翅膀长而尖"                            #翅膀的特征
claw_1="爪子是蹼状的"                          #爪子的特征
wildGoose = Geese(beak_1,wing_1,claw_1)       #创建大雁类的实例
wildGoose.fly("我飞行的时候,一会排成人形,一会排成一字")   #调用实例方法

运行上面代码,会输出:

我是大雁!我有以下特征:
喙的基部较高,长度和头部几乎相等
翅膀长而尖
爪子是蹼状的
我飞行的时候,一会排成人形,一会排成一字

2.创建数据成员并访问
数据成员是指在类中定义的变量,即属性,根据定义位置,有可以分为类属性和实例属性。
(1)类属性
类属性是指定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值,也就是在所有实例化的对象中公用。
(2)实例属性
实例属性是指定义在类的方法中的属性,只作用于当前实例中。

访问限制

在类的内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏了类内部的复杂逻辑。但是Python并没有对属性和方法的访问权限进行限制。为了保证类内部的某些属性或方法不被外部所访问,可以在属性或方法前面添加单下划线(_foo)、双下划线(__foo)或首尾加双下划线(__foo__),从而限制访问权限。其中,单下划线、双下划线、首尾双下划线的作用如下:
(1)首尾双下划线表示定义特殊方法,一般是系统定义名字,如__int__()
(2)以单下划线开头的表示protected(保护)类型的成员,只允许类本身和子类进行访问,但不能使用“from module import*”语句导入。
(3)双下划线表示private(私有)类型的成员,只允许定义该方法的类本身进行访问,而且也不能通过类的实例进行访问,但是可以通过“类的实例名._类名__xxx”方式访问。

属性(property)

创建应用计算的属性

在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要在添加一对小括号“()”,这样可以让代码更加简洁。
通过@property创建用于计算的属性的语法格式如下:

@property
def methodname(self):
     block

methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性名。
self:必要参数,表示类的实例。
block:方法体,实现的具体功能。在方法体中,通常以return语句结束,用于返回计算结果。

class Rect:
    def __init__(self,width,height):
        self.width = width                  #矩形的宽
        self.height = height                #矩形的高
    @property                               #将方法转化为属性
    def area(self):                         #计算矩形的面积的方法
        return self.width*self.height       #返回矩形的面积
rect = Rect(800,600)                        #创建类的实例
print("面积为:",rect.area)                  #输出属性的值

运行上面代码,将显示以下运行结果:面积为: 480000
通过@property转换后的属性不能重新赋值,如果对其重新赋值,将抛出异常。

继承

在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值