Python 基础复习 Review_4_类

目录

8、类

1)创建类和使用类

2)使用类和实例

3)继承

4)导入类


8、类

首先有几个问题,先看:

(1)Q:类是什么?

A:类就好比现实世界中,猫是一类动物

(2)Q:对象是什么?

A:对象就是这个类中的各种品种,好比猫又有波斯猫、折耳猫

(3)Q:在此语境中创建类的实例是什么意思?

A:初步理解为,这个实例就是创建对象

(4)Q:如何理解类中的通用行为?

A:好比在现实世界中,被归为一类的事物,都有一些共同特性

所以,类就是一种对象类型。在构建类的时候,首先需要对这种类型进行初始化,也就是要说明这种类型的基本结构。一旦这个类型的对象被调用,也就是要运行这个类型的基本结构。

1)创建类和使用类

使用类几乎可以模拟任何东西。这里有一个表示喵喵的简单类,这个类表示的不是单一喵喵,而是任何喵喵。对于喵喵,我们都知道它们有身份信息,而且还会晒太阳、卖萌。由于大多数喵喵都具备上述信息与行为,这个类(使Python知道如何创建表示喵喵的对象)也将包含它们。编写玩类之后,将用它来创建表示特定喵喵的实例。

1)创建一个🐱类

根据🐱类创建的每个实例都将存储身份信息,并赋予每只喵喵晒太阳(bask())和卖萌(act_cute())的能力:

miao.py

class Cat():
        """模拟🐱"""
    def __init__(self, name, age):
    """初始化属性name和age"""
        self.name = name
        self.age = age
    def bask(self):
        """模拟🐱晒☀"""
        print(self.name.title()+" is now basking.")
    def act_cute(self):
        """模拟🐱卖萌o(=•ェ•=)m~"""
        print(self.name.title()+ " is acting cute~")

在第一行,定义了一个名为Cat的类。( 补充一下:在Python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白来创建这个类。第二行对这个类的功能进行了描述。

类中的函数称为方法,你把它看作函数即可。这里来讲一下其中的一个方法:

__init__()

有关函数的一切都适用于方法,目前,有意义的区别就在于调用方法的方式。init()是一个特殊的方法,每当你根据Cat类创建新实例时,Python都会自动运行它。方法的开头和末尾各有两个下划线,避免Python默认方法与普通方法发生名称冲突。在第三行代码中,将方法init()定义成了包含三个形参:self、name、age。

那为什么必须包含self呢,有了self,实例才能访问类中的属性和函数。每当我们根据Cat类创建实例时,都秩序给最后两个形参name、age提供值。以self为前缀的变量都可供类中的所有方法使用。可以通过实例访问的变量称为属性

在这个类里还定义了方法bask()和act_cute(),如果在后期这个类放在游戏当中,扩展这些方法,这些方法将包含创建🐱晒太阳和卖萌动画效果的代码;如果这个类是作用于仿生🐱上......

2)根据类创建实例

这么说,可以将视为有关如何创建实例的说明;那么我们创建的这个Cat类就是一系列说明,它可以让Python知道如何创建特定小猫的实例。下面这一个就是表示特定小猫的实例:

class Cat():
    def __init__(self, name, age):
    """初始化属性name和age"""
        self.name = name
        self.age = age
    def bask(self):
        """模拟🐱晒☀"""
        print(self.name.title()+" is now basking.")
    def act_cute(self):
        """模拟🐱卖萌o(=•ェ•=)m~"""
        print(self.name.title()+ " is acting cute~")
my_cat = Cat('ora', 2)
print("My cat's name is "+my_cat.name.title()+".")
print("My cat is "+str(my_cat.age)+"years old.")

当Python读取到第二行代码时,Python使用实参‘ora’和2调用Cat类中的方法init()。方法init()创建一个表示特定🐱的实例,并使用我们提供的值来设置属性name、age。首字母大写的名称(Cat)指的是类,小写的(my_cat)指的是根据类创建的实例。

1)访问属性

访问实例的属性常常使用句点表示法。比如上面第三行的my_cat.name,当Python寻找到实例my_cat,再寻找这个实例相关联的属性name。在类中引用属性,用self.name,在外面、实例引用属性,用实例名.name

2)调用方法

根据Cat类创建实例后,可使用句点表示法来调用Cat类中已定义的任何方法

重复一遍,印象深刻:在类中引用属性,用self.name,在外面、实例引用属性,用实例名.name

如果后面的实例中,你要喵晒太阳,则写上my_cat.mask(),此时Python在类Cat中查找方法mask()并运行其代码

Ora is now basking.

3)创建多个实例

你可以按照自己的需要根据类创建任意数量的实例。再给我好朋友一只🐱:

class Cat():
    def __init__(self, name, age):
    """初始化属性name和age"""
        self.name = name
        self.age = age
    def bask(self):
        """模拟🐱晒☀"""
        print(self.name.title()+" is now basking.")
    def act_cute(self):
        """模拟🐱卖萌o(=•ェ•=)m~"""
        print(self.name.title()+ " is acting cute~")
my_cat = Cat('ora', 2)
hui_cat = Cat('bla' 2)
print("My cat's name is "+my_cat.name.title()+".")
print("My cat is "+str(my_cat.age)+"yyears old.")
my_cat.bask()
print("Hui cat's name is "+my_cat.name.title()+".")
print("Hui cat is "+str(my_cat.age)+"yyears old.")
hui_cat.act_cute()

在这个实例中,我们创建了两只猫,名为Ora和Bla。每一只是一个独立的实例,有自身属性,能执行操作。

2)使用类和实例

当类编写好了之后,就要开始根据类创建实例。往往实例数量一多就很麻烦,可以直接修改实例的属性,也可以编写方法以特定的方式进行修改。

1)给属性指定默认值

class 类():
    def __init__(self,xxx,xx,x):
    """初始化描述什么类的属性"""
    self.xxx = xxx
    self.xx = xx
    self.x = x
    self.默认值名字 = 你给的值
略

考虑到不同情况下可能还要修改:

2)修改属性的值

有三种不同的方式修改属性的值:① 直接通过实例进行修改; ②通过方法进行设置; ③通过方法进行递增,也就是增加特定值。

①直接修改属性的值

修改我上个代码块中你给的值

②通过方法修改属性的值

这个方法不会像上一个那样,破坏了程序的封装性;无需直接访问属性,就可以让值在其内部更新。方法不必多说,就是在你定 义的这个类之中添加一些逻辑运算或者其它你喜欢的方式。

③通过方法对属性的值进行递增

方法与上个类似,这里不做赘述。

3)继承

如果你编写的类是另一个现成的类的特殊版本,可使用继承

一个类(子类)继承另一个类(父类)时,它将自动获得父类的所有属性和方法,同时它还可以定义自己的属性和方法;原有的类称为父类

1)子类的方法init()

举个例子,波斯猫具有猫的普适属性:

class Persian_cat(Cat):
    def __init__(self,name,age):
        super().__init__(name,age)

这里的super()是一个特殊函数,帮助Python调用父类的方法init(),使Persian_cat实例包含父类的所有属性。父类也叫超类(superclass)。其实还有另一种方法强行关联子类和父类:

class Persian_cat(Cat):
    def __init__(self,name,age):
        Cat().__init__(name,age)

喜欢哪种用哪种,不急的话注释一下。

2)给子类定义属性和方法

这里不必多说,需要特殊属性加上就好,需要特殊函数就创建。

子类和父类有相同名称的方法时,会优先执行子类的方法。

3)将实例用作属性

如果你的这个描述对象是个庞然大物,类中的细节将会越来越多;这是为了避免冗杂和赘述,你可以将类的一部分作为一个独立的类提取出来,也就是将大型类拆分成多个协作的小类。举个例子,比如细分猫的脾气、性格。

4)导入类

为了使文件更加简洁明了,你可以将类储存在模块中,然后再主程序中导入所需的模块。导入模块和导入类的方法一样:

import 类名                   #导入某个类
from 模块名 import类名         #从某个模块导入某个类(该模块中有许多类)
from 模块名 import*           #从某个模块导入该模块中所有的类
模块名.类名(参数)             #调用

在一个模块中可以存储多个类;而导入多个类只需要用逗号隔开:

from 模块 import 类1,类2,等等

在这里不建议一行导入整个模块,分行易于编辑、维护,还有种种便利。

扩充一个小知识点:Python标准库。它使Python自带的一组文件(模块),就是别人写好的代码,放到这些文件(模块)中,需要导入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Haku_Marcia

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

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

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

打赏作者

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

抵扣说明:

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

余额充值