Python七天快速入门——第五天

本教程直接从语言特性入手,旨在让没有编程基础的小白或者其他语言领域大佬快速上手Python,本文只介绍最基础内容,深入使用Python不在本教程范围😉

第五天
欢迎大家关注文末公众号,您的关注是我最大的动力


一、面向对象

读者理解面向对象理解以下内容即可,这些内容已经足够完成本章内容的学习。
理解面向对象首先明白对象是什么:
一个可以具现化的实体都可以称作对象,对象是一种极为宽泛的定义,读者不可以简单的将对象理解为数据和数据的方法.

例如,我们可以将一只中华田园猫作为一个对象,当我们有很多只田园猫时,就可以从多个对象(中华田园猫)找出每个对象(田园猫)的共性,将这些共性放到一起就是一个类(多只田园猫的共性)。

二、 类

2.1 类的创建

【1】创建类

我们可以设想一个这样的场景,比如我们准备开一个猫咖,我们就需要对每一个种类的猫进行统一的管理。<font

color=DeepSkyBlue>
示例如下:

class ZhangHuaCat:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def Having_Dinner(self):
        print(f"{self.name} is having dinner.")
    def Sleeping(self):
        print(f"{self.name} is sleeping.")

如上面的示例,我们首先创建了一个中华田园猫的类,每个类中存放猫的名字和年龄两个属性,并且设置猫猫的睡觉和吃饭两个方法。

【1】定义了一个名为“ZhangHuaCat”的类,这里注意一点,类的命名一般采用”骆驼拼写法“——第一个词的首字母,以及后面每个词的首字母都大写(也有一种第一个字母小写,后面单词大写的写法,但在Python中不推荐)
【2】类中的函数称为方法,要理解类的含义,我们首先需要了解类中的_ init_()函数。一般所有类中都有一个名为 _ init_() 的函数,这个方法在创建新的实例时执行。使用 init() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作

在本例中,我们定义了三个形参:self、name 和 age。在 _ init_()方法中,self必须位于所有形参中的第一个,当然可以将self称作其他名称的变量,但是其位置必须位于 _ init_()函数的所有形参中的第一个。

在使用 Python 创建ZhangHuaCat 实例时,将自动传入参数 self。每个与实例相关联的方法调用都自动传递实参 self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。创建实例时,Python 将调用实例的类的方法__init__(),这样能够传递名字和年龄,self 会自动传递,因此不需要传递self本身。每当根据类创建实例时,都只需给最后两个形参(name 和 age)提供值。
【3】在实例中我们创建了两个方法,用来标明每只猫现在的状态,接下来创建实例的过程中会为各位读者演示创建实例

【2】创建实例

我们的猫咖要引进一只可爱的田园猫:

创建一只新猫的实例,猫猫的名字为吃货:

NewCat=ZhangHuaCat('ChiHuo',2)
print(f"{NewCat.name} is {NewCat.age} years old.")

输出如下:

使用语句:

NewCat=ZhangHuaCat('ChiHuo',2)

就创建了一只名叫吃货的猫猫。

【3】访问实例

  • (1) 访问实例属性
    访问实例的属性可以使用以下方法:
NewCat.name
NewCat.age
  • (2) 访问实例方法
    在本例中,吃饭和睡觉时互斥的结构,例如吃货
    先吃饭,后睡觉可以如下设置。
NewCat=ZhangHuaCat('ChiHuo',2)
NewCat.Having_Dinner()
NewCat.Sleeping()

输出如下:

2.2 类的应用

我们的猫咖现在需要监控猫猫的属性现在不能只限于名字和年龄,现在猫咖需要管理猫猫的体重和疫苗信息,需要在类中加入"weight"”vaccine“,同时加入"Weight"”Vaccine“两个方法,用来显示重量和打疫苗的次数。

2.2.1 给类制定默认值

所有猫猫的初始疫苗信息为0,类的设计如下:

class ZhangHuaCat:
    def __init__(self,name,age,weight):
        self.name=name
        self.age=age
        self.weight=weight
        self.vaccine=0
    def Having_Dinner(self):
        print(f"{self.name} is having dinner.")
    def Sleeping(self):
        print(f"{self.name} weighs {self.weight} kilograms.")
    def Weight(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    def Vaccine(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")

疫苗的初始值是0次,可以使用如下操作调出疫苗的打印次数:

NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.Having_Dinner()
NewCat.Weight()
NewCat.Vaccine()

输出如下:

设定的默认值只是疫苗的初始状态,后续会进行修改,下面就介绍属性值的修改。

2.2.2 修改类的属性值

这里介绍两种常用的修改默认值的方法:

第一种:直接修改属性的值

使用这种方法直接赋值即可完成属性值的修改:

NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.vaccine=2
NewCat.Vaccine()

输出如下:

第二种:通过设置方法修改属性的值
【1】直接定义形参修改属性

可以在类中加入一个函数,或者说是定义一个方法,用来修改属性的值,如下:

class ZhangHuaCat:
    def __init__(self,name,age,weight):
        self.name=name
        self.age=age
        self.weight=weight
        self.vaccine=0
    def Having_Dinner(self):
        print(f"{self.name} is having dinner.")
    def Sleeping(self):
        print(f"{self.name} weighs {self.weight} kilograms.")
    def Weight(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    def Vaccine(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    #定义方法用来修改打疫苗的次数
    def Vaccine_ValueModify(self,vaccine):
        self.vaccine=vaccine

修改方法如下:

NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify(2)
NewCat.Vaccine()

输出结果如下:

【2】不定义形参修改属性

可以设计一种方法,传递形参,每调用一次函数就使疫苗次数增加一次:

class ZhangHuaCat:
    def __init__(self,name,age,weight):
        self.name=name
        self.age=age
        self.weight=weight
        self.vaccine=0
    def Having_Dinner(self):
        print(f"{self.name} is having dinner.")
    def Sleeping(self):
        print(f"{self.name} weighs {self.weight} kilograms.")
    def Weight(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    def Vaccine(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    #定义方法用来增加打疫苗的次数
    def Vaccine_ValueModify(self):
        self.vaccine+=1

调用过程如下:

NewCat=ZhangHuaCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine()

输出结果如下:

2.3 继承

我们在编写类时,并非总是要从空白开始。我们编写类的时候可能会用到其他类,这时就需要使用到一种方法——继承。
使用继承时,我们首先要带着这些概念理解继承:

  1. 一个类继承另一个类时,将自动获得另一个类的所有属性和方法。
  2. 原有的类称为父类,而新类称为子类。
  3. 子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

2.3.1 子类的继承

【1】子类的方法_init_()

子类继承后一般会调用父类的方法_init_()。
我们的猫咖需要定义猫猫的公母,母猫不需要操作,公猫需要设置是否绝育的信息。

  1. 母猫的类(使用pass)
    于是可以有以下代码,创建了一个名为FemaleCat的子类:
class FemaleCat(ZhangHuaCat):
    pass

使用 pass方法 ,可以不向该类添加任何其他属性或方法,这样, FemaleCat类拥有与 ZhangHuaCat 类相同的属性和方法。
例如可以进行如下操作:

NewCat=FemaleCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine()

这样的输出与使用父类构造的实例是相同的。
输出如下:

2. 公猫的类(使用super() )
这里的内容需要着重注意:
在子类中添加 init() 方法时,子类将不再继承父的 init() 函数,子类的 init() 函数会覆盖对父的 init() 函数的继承——这种情况称为重写父类。(本文2.3.2节)如果需保持父的 init() 函数的继承,需要添加对父的 _ init _() 函数的调用。
这种定义子类的方法中,python提供了super() 方法,这种方法会使子类从其父继承所有方法和属性。有时候父类也称为超类(superclass),名称 super 由此而来。
示例代码如下:

class ZhangHuaCat:
    def __init__(self,name,age,weight):
        self.name=name
        self.age=age
        self.weight=weight
        self.vaccine=0
    def Having_Dinner(self):
        print(f"{self.name} is having dinner.")
    def Sleeping(self):
        print(f"{self.name} weighs {self.weight} kilograms.")
    def Weight(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    def Vaccine(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    #定义方法用来增加打疫苗的次数
    def Vaccine_ValueModify(self):
        self.vaccine+=1
#子类
class FemaleCat(ZhangHuaCat):
    pass
class MaleCat(ZhangHuaCat):
    def __init__(self,name,age,weight):
        super().__init__(name,age,weight)

调用类如下:

NewCat=MaleCat('ChiHuo',2,2)
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine_ValueModify()
NewCat.Vaccine()

输出如下:

【2】子类属性和方法定义

子类的属性和方法的定义与父类的定义方法相同,下面的例子可以很好的介绍子类的定义:

class ZhangHuaCat:
    def __init__(self,name,age,weight):
        self.name=name
        self.age=age
        self.weight=weight
        self.vaccine=0
    def Having_Dinner(self):
        print(f"{self.name} is having dinner.")
    def Sleeping(self):
        print(f"{self.name} weighs {self.weight} kilograms.")
    def Weight(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    def Vaccine(self):
        print(f"{self.name} was vaccinated {self.vaccine} times.")
    #定义方法用来增加打疫苗的次数
    def Vaccine_ValueModify(self):
        self.vaccine+=1
class FemaleCat(ZhangHuaCat):
    pass
class MaleCat(ZhangHuaCat):
    def __init__(self,name,age,weight):
        super().__init__(name,age,weight)
        self.sterilization=False
    def Sterilization(self):
        if self.sterilization:
            print(f"{self.name} has been neutered")
        else:
            print(f"{self.name} was not neutered.")

调用如下:

NewCat=MaleCat('ChiHuo',2,2)
NewCat.sterilization=True
NewCat.Sterilization()

输出如下:

【3】重写父类

对于父类的方法,只要它不符合子类模拟的实物的行为,都可以进行重写。为此,可在子类中定义一个与要重写的父类方法同名的方法。这样,Python 将不会考虑这个父类方法,而只关注在子类中定义的相应方法。
这点在——公猫的类的方法_init_()——有具体应用。

2.4 类的导入

导入过程与导入函数相同,将类的名称等价于函数名即可。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦走一口田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值