64. 方法的值的传递及调用类内部的属性、方法

news2025/7/10 20:10:02

64. 方法的值的传递及调用类内部的属性、方法

文章目录

  • 64. 方法的值的传递及调用类内部的属性、方法
    • 1. 知识回顾
    • 2. 值的传递
    • 3. 没有值
    • 4. 需要向方法传递值
    • 5. 调用类内部的属性和方法
    • 6. 综合代码
    • 7. 类在爬虫中的应用
      • 7.1 创建类
      • 7.2 创建对象
      • 7.3 调用方法
      • 7.4 第2次调用方法
      • 7.5 第2次调用方法
    • 8. 总结

1. 知识回顾

定义在类的函数称为自定义函数

定义在类的函数称为方法

直接写在类里的变量称为类属性

创建对象语法:

对象名=类名( )

调用属性语法:

对象名.属性

调用方法语法:

对象名.方法名(值,…)

【语法总结】

都是对象名开头。

创建对象要用等于号=

属性和方法是类自己的东西,用个英文小圆点.就能实现。

因为方法要传值进去,因此需要紧跟一个英文圆括号()

2. 值的传递

调用方法语法:

对象名.方法名(值,…)

这里的值是指外界要传入到方法中的值。

方法的值传递有2种情况:

  1. 没有值

  2. 有值

3. 没有值

对象名.方法名()

不需要向方法传递值时括号为空。

观察下面代码的最后一行,重点关注括号。

# 定义一个车类,类名为Cars
class Cars:
    # 在类中定义的函数称为方法    
    def drive(self):
        # 方法中的代码块
        print('汽车正在向前行驶!')

# 创建对象:对象名=类名( ),这里对象名为aodi_A6 
aodi_A6 = Cars( )  

# 调用方法检查汽车前进的功能:对象名.方法名(值)
aodi_A6.drive()

【终端输出】

汽车正在向前行驶!
print('汽车正在向前行驶!')

上述print输出语句是drive方法的代码块。

这个代码块是一个输出语句。

输出语句是固定的,语句中没有任何需要传值的变量,因此调用方法时即能输出该语句,不需要外界传递任何参数。

因此调用方法时括号为空。

不需要传递参数时括号为空。

aodi_A6.drive()这里不需要传入值,因此括号为空。

4. 需要向方法传递值

对象名.方法名(值,…)

需要传递值时括号中写入具体值或变量名。

我们生产的汽车除了要检查它的前进、刹车、倒车功能。

我们还可以测试它的时速。

【体验代码】

# 定义一个车类,类名为Cars
class Cars:  
    # 在类中定义的函数称为方法,speed是外界传入的值
    def drive(self, speed):
        print(f'汽车可以提速到{speed}公里每小时!') 
      
# 创建对象:对象名=类名( )
aodi_A6 = Cars( )      
# 调用方法语法:对象名.方法名(值),120是要传入方法的具体值
aodi_A6.drive(120)

【终端输出】

汽车可以提速到120公里每小时!

speed [spiːd]速度。

def drive(self, speed):
    pass
  1. 方法中的第1个参数必须是self

  2. 方法的第2个参数是speedspeed是调用方法时要传入的值。

print(f'汽车可以提速到{speed}公里每小时!') 

上述print输出语句是drive方法的代码块。

这个代码块是一个输出语句。

但这个输出语句不是固定的。

输出语句中多加了一个变量speed

输出语句随外界的传入的值的改变而改变。

这里的f的作用是格式化字符串。

120是调用方法时给类中的方法传入的值。

120先传值给方法中的speed

方法中的speed将接收的值120传递给输出语句的speed

因此才输出汽车可以提速到120公里每小时!

传递的值改变,输出的内容也会跟着改变。

【值的传递过程】

  1. 调用类的方法时,我们直接忽略第一个self参数。

  2. 特别注意其它参数值按位置传递入类的方法。

在这里插入图片描述

特别注意方法的参数是按位置进行传递的。

【举例说明】

def drive(self, speed, type, price):
        pass

aodi_A6.drive(120, "奥迪", "40万")

参数值按位置传递给类的方法。

  1. 忽略self参数。

  2. 120传递给speed

  3. "奥迪"传递给type

  4. "40万"传递给price

【f格式化字符串编写思路】

步骤一:编写格式化模板

  1. 我们要输出的内容是:汽车可以提速到120公里每小时!

  2. 把要格式化的内容用英文大括号加变量名{speed}替换:

汽车可以提速到{speed}公里每小时!

步骤二:添加格式化符号f

在格式化模板前添加一个表示需要格式化字符串的符号即小写的英文字母f即可。

print(f'汽车可以提速到{speed}公里每小时!')

5. 调用类内部的属性和方法

# 定义一个车类,类名为Cars
class Cars:
    # 直接写在类里的变量称为类属性
    color_1 = "红色"
    type_1 = "小轿车"
   
    # 定义在类中的函数称为方法
    def drive(self, speed):
        print(f'经测试,{self.type_1}的最高时速是{speed}公里每小时。')
        print('经测试,{}的最高时速是{}公里每小时。'.format(self.type_1, speed))
# 创建对象,对象名为aodi_A6 
aodi_A6 = Cars( )      

# 查看汽车的车型
print(aodi_A6.type_1)

# 调用方法
aodi_A6.drive(120)

【终端输出】

小轿车
经测试,小轿车的最高时速是120公里每小时。
经测试,小轿车的最高时速是120公里每小时。
# 调用属性
print(aodi_A6.type_1)
# 调用方法
aodi_A6.drive(120)

上述两段代码,一个调用属性,一个是调用方法。

观察代码我们发现,调用方法时是可以不用print输出语句的。

观察上述代码的终端,我们输出了2个语句。

是因为我在drive方法中写了2个print语句,目的是复习下format字符串格式化方法。

【format格式化字符串编写思路】

步骤一:编写格式化模板

  1. 我们要输出的内容是:经测试,小轿车的最高时速是120公里每小时。

  2. 把要格式化的内容用英文大括号{}替换:

小轿车替换为{}

120替换为{}

'经测试,{}的最高时速是{}公里每小时。

步骤二:语法关键字

  1. 输入一个英文小圆点.

  2. format关键字

步骤三:添加要格式化的变量名。

self.type_1要格式化的第1个字符串type_1

speed要格式化的第2个字符串speed

观察代码,大家发现type_1变量前多了一个self.

这是为什么呢?

我们调用方法外的属性的语法为:对象名.属性

我们在类内部的方法中调用类的属性其它类的方法时,需要在前面加上slef. 如:

self.属性名

self.方法名

print(aodi_A6.type_1)这句代码是在方法外调用类的属性,因此对象名.属性

print('经测试,{}的最高时速是{}公里每小时。'.format(self.type_1, speed))这里是在类中的drive方法中调用类的属性,因此用self.属性名

这个其实不难,大家注意区分是在方法中调用还是在方法外调用即可。

调用方法也是同样的语法。

如果在类外调用方法用:

对象名.方法名(值,…)

如果类中的方法调用其他方法:

slef.方法名(值,…)

假设一个类有5个方法,方法3要调用方法2,则在方法名前加slef.

6. 综合代码

# 定义一个车类,类名为Cars
class Cars:

    # 直接写在类里的变量称为类属性
    color_1 = "红色"
    color_2 = "黑色"
    color_3 = "黄色"
    color_4 = "绿色"
    type_1 = "小轿车"
    type_2 = "越野车"
    type_3 = "公交车"
    type_4 = "跑车"
   
    # 在类中定义的函数称为方法
    # 方法的第1个参数必须是slef    
    def drive(self, speed):
        # 方法中的代码块
        print(f"经测试,{self.color_4}{self.type_4}的最高时速是{speed}公里每小时。")
        print("经测试,{}的{}的最高时速是{}公里每小时。".format(self.color_2, self.type_4, speed))
        print("经测试,{}的{}的最高时速是{}公里每小时。".format(self.color_1, self.type_4, speed))
# 创建对象:对象名.类名( )
paoche = Cars( )      

# 查看汽车的颜色
print(paoche.color_4)
print(paoche.color_2)
print(paoche.color_1)
# 查看汽车的车型
print(paoche.type_4)

# 调用对象:对象名.方法名(值)
# 测试车速
paoche.drive(230)

【终端输出】

绿色
黑色
红色
跑车
经测试,绿色的跑车的最高时速是230公里每小时。
经测试,黑色的跑车的最高时速是230公里每小时。
经测试,红色的跑车的最高时速是230公里每小时。

这里我创建了的对象是跑车。

并且生产了不同颜色的跑车。

大家可以编写代码生产一款你喜欢的跑车,可以试着给跑车多增加几个属性,多传入结果值。例如价格、车长等等。

7. 类在爬虫中的应用

类的知识点相对抽象,初学者很难理解,下面我们通过一个实例来更深层次的理解类的作用。

下面是爬取某站视频的部分代码,大家重点关注类相关的知识点即可。

【备注】下面的代码不全,运行下面的代码是不会成功下载到视频的。

'''批量下载视频'''
import requests  # 网络请求模块
import time      # 时间模块
import random    # 随机模块
import os        # 操作系统模块
import re        # 正则表达式


# 哔哩哔哩小视频json地址
json_url = 'http://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset={page}1&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc'

class Crawl():
    def __init__(self):
        # 创建头部信息
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0'}

    def get_json(self,json_url):
        response = requests.get(json_url, headers=self.headers)
        # 判断请求是否成功
        if response.status_code == 200:
            return response.json()  # 返回json信息
        else:
            print('获取json信息的请求没有成功!')
    #下载视频
    def download_video(self,video_url,titlename):
        # 下载视频的网络请求
        response = requests.get(video_url, headers=self.headers, stream=True)
        if not os.path.exists('video'):  # 如果video目录不存在时
            os.mkdir('video')             # 创建该目录
        if response.status_code == 200:   # 判断请求是否成功
            if os.path.exists('video'):
                with open('video/'+titlename+'.mp4', 'wb')as f:                     # 将视频写入指定位置
                    for data in response.iter_content(chunk_size=1024):             # 循环写入,实现一段一段的写
                        f.write(data)                                                # 写入视频文件
                        f.flush()                                                    # 刷新缓存
                    print('下载完成!')
        else:
            print('视频下载失败!')

if __name__ == '__main__':
    c = Crawl()                # 创建爬虫类对象
    for page in range(0,10):  # 循环请求10页每页10组数据
        json = c.get_json(json_url.format(page=page))  # 获取返回的json数据
        infos = json['data']['items']  # 信息集
        for info in infos:             # 遍历信息
            title = info['item']['description']  # 视频标题
            # 只保留标题中英文、数字与汉字,其它符号会影响写入文件
            comp = re.compile('[^A-Z^a-z^0-9^\u4e00-\u9fa5]')
            title = comp.sub('', title)  # 将不符合条件的符号替换为空
            video_url = info['item']['video_playurl']  # 视频地址
            print(title,video_url)                # 打印提取的视频标题与视频地址
            c.download_video(video_url, title)  # 下载视频,视频标题作为视频的名字
        time.sleep(random.randint(3, 6))  # 随机产生获取json请求的间隔时间

7.1 创建类

class Crawl():
    pass

crawl[krɔːl]:爬虫

  1. 创建类的代码在程序的第12行。

  2. 类名为Crawl,类名的首字母C是大写。

  3. class是定义类的关键字。

7.2 创建对象

c = Crawl() 
  1. 创建对象的代码在程序的第41行,语法为:对象名=类名( )

  2. 类名为Crawl

  3. 给对象起的名字为c

7.3 调用方法

def get_json(self,json_url):
        response = requests.get(json_url, headers=self.headers)
        # 判断请求是否成功
        if response.status_code == 200:
            return response.json()  # 返回json信息
        else:
            print('获取json信息的请求没有成功!')

在类中定义的函数称为方法。

上面这段代码是类中的一个方法,该方法的作用是访问网页。

  1. 方法名为get_json

  2. 方法的第1个参数必须是slef,第2个参数是json_url。

  3. 剩下的语句是代码块。

代码块的大概意思是:

requests.get利用是请求模块中的get方法访问网页。

if response.status_code == 200:如果返回的状态码是200,访问网页成功。

return response.json()返回json信息。

如果返回的状态码不是200,访问网页失败,输出获取json信息的请求没有成功!

该方法的调用代码在程序的第43行,如下:

json = c.get_json(json_url.format(page=page))  
  1. 这是在类外部调用方法,语法为:对象名.方法名(值)

  2. 对象名为c

  3. 方法名get_json

  4. 这里要传入的值有点复杂,它是字符串格式化语句。

# 哔哩哔哩小视频json地址
json_url = 'http://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset={page}1&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc'

json_url在程序的第10行就进行了赋值。

但注意这个变量里有一个{page}需要格式化的字符。

7.4 第2次调用方法

类的第二个方法如下:

def download_video(self,video_url,titlename):
        # 下载视频的网络请求
        response = requests.get(video_url, headers=self.headers, stream=True)
        if not os.path.exists('video'):  # 如果video目录不存在时
            os.mkdir('video')             # 创建该目录
        if response.status_code == 200:   # 判断请求是否成功
            if os.path.exists('video'):
                with open('video/'+titlename+'.mp4', 'wb')as f:                     # 将视频写入指定位置
                    for data in response.iter_content(chunk_size=1024):             # 循环写入,实现一段一段的写
                        f.write(data)                                                # 写入视频文件
                        f.flush()                                                    # 刷新缓存
                    print('下载完成!')
        else:
            print('视频下载失败!')

该方法的作用是下载视频。

def download_video(self,video_url,titlename):
    pass
  1. 方法名download_video

  2. 方法的第1个参数:self

  3. 方法的第2个参数:video_url

  4. 方法的第3个参数:titlename

7.5 第2次调用方法

c.download_video(video_url, title) 
  1. c是对象名

  2. download_video方法名

  3. video_url, title要传入方法的值。

【温馨提示】

为了讲解类的相关知识,例子中的代码块仅有1个输出语句,许多同学会好奇一个输出语句不用类反而更方便,为什么多加一层。

因此多写了累在爬虫中的应用这部分笔记。

大家不需要知道每句代码的意思,重点关注一下类相关的语法,并对爬虫的结构有个框架的认识。

大家继续加油哦,再坚持一下下,我们就快能自己写爬虫代码批量下载视频了。

8. 总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSE ZooKeeper 数据导入导出功能上线

作者:草谷 背景 MSE 提供了托管版的 ZooKeeper,拥有比自建开源 ZooKeeper 稳定性更高的SLA,同时管控面提供了丰富的服务自治功能。赶在2022年的岁末,MSE ZooKeeper 上线了一个非常实用的功能-数据导入导出功能,彻底解…

Mybatis自动生成增删改查代码

GitHub项目地址 Gitee项目地址 使用 mybatis generator 自动生成代码&#xff0c;实现数据库的增删改查。 1 配置Mybatis插件 在pom文件添加依赖&#xff1a; <plugins> <plugin><groupId>org.mybatis.generator</groupId><artifactId>myba…

宝塔面板Nginx开启Brotli压缩,提升网站加载速度

前言Google 认为互联网用户的时间是宝贵的&#xff0c;他们的时间不应该消耗在漫长的网页加载中&#xff0c;因此在 2015 年 9 月 Google 推出了无损压缩算法 Brotli。Brotli 通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩&#xff0c;与 Gzip相比效率…

图解cross attention

英文参考链接&#xff1a; https://vaclavkosar.com/ml/cross-attention-in-transformer-architecture 交叉注意力与自我注意力 除了输入&#xff0c;cross-attention 计算与self-attention相同。交叉注意力不对称地组合了两个相同维度的独立嵌入序列&#xff0c;相比之下&a…

移动互联网社交江湖已定,抖音为何仍不放过微信?

进入2023年&#xff0c;抖音集团依然放不下“社交梦”。2022年12月30日&#xff0c;抖音官网上线了一款名为“抖音聊天”的桌面端聊天软件&#xff0c;提供Windows和Mac两个版本&#xff0c;进入软件需使用抖音App扫码登录。这并不是抖音集团首次推出社交产品。2019年以来&…

Day854.两阶段终止模式 -Java 并发编程实战

两阶段终止模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于两阶段终止模式的内容。 从纯技术的角度看&#xff0c;都是启动多线程去执行一个异步任务。既启动&#xff0c;那又该如何终止呢&#xff1f; 那如何优雅地终止线程&#xff0c;正所谓有始有终。在Ja…

Kafka 概念

Kafka 属于分布式的消息引擎系统&#xff0c;主要功能 &#xff1a;提供一套完备的消息发布与订阅解决方案 生产者和消费者都是客户端&#xff08;Clients&#xff09;&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1a;向主题发布消息的客户端应用程序消费者…

前端基础(九)_this基本使用、this指向判断、改变this指向的方法

前言&#xff1a; 看这个例子&#xff1a; 例&#xff1a;给所有的div标签都添加点击事件&#xff0c;并打印当前节点的内容 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…

HW14基于规则化的终身学习Regularization-based Lifelong Learning

文章目录一、介绍-终身学习目标数据集任务示例代码-准备数据模型体系结构样本代码-训练和评估Training Pipeline:MAS - Memory Aware SynapseSISCP - Sliced Cramer Preservation二、实验1、baseline2、EWC3、MAS4、SI5、RWalk6、SCP一、介绍-终身学习 目标 一个模型可以打败…

Naive UI 组件使用体验之-级联选择 Cascader

使用场景 地址区域选择 简单使用 安装依赖 npm install naive-ui -D 按需引入之-手动引入 import {NCascader,CascaderOption } from naive-ui 使用 <n-cascader:value"regionValue":options"regionOptions":multiple"false"placehol…

一篇搞懂Python中的随机数

在 python 中生成随机样本的所有你需要的示例列表 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 在这篇博客中&#xff0c;我将演示如何根据不同的需求在python…

Docker三剑客——Docekr Swarm

目录 一、概述 二、Swarm 的核心概念 1. Node&#xff08;节点&#xff09; 2. Service&#xff08;服务&#xff09; 3. Task&#xff08;任务&#xff09; 三、Swarm 服务的运行部分 1. 工作节点 2. 服务、任务和容器 3. 任务和调度 4. 副本服务和全局服务 四、Swa…

3. 【prometheus 学习】prometheus数据类型

prometheus 四种数据类型学习及测试 安装 1&#xff09;从官网下载对应版本的二进制压缩包并解压 2&#xff09;新建prometheus.yml 文件&#xff0c;静态指定抓取本机的9091端口&#xff0c;设置采样时间2秒1次&#xff0c;方便一会测试。 scrape_configs:- job_name: defin…

单细胞UMAP图只标记特定细胞群、圈定细胞群及坐标轴修改

最近有小伙伴私信我&#xff0c;如下的单细胞UMAP图怎么做&#xff1f;是啥样的图呢&#xff1f;就是UMAP图上其他群是灰色的&#xff0c;只有某个群或者某几个群是标记颜色的&#xff0c;比较突出。其实很简单&#xff0c;一种办法可参考我们之前写过的ggplot做UMAP图&#xf…

uni-app使用蓝牙

目录 前言 连接蓝牙 开启蓝牙适配器 发现蓝牙 连接蓝牙 收发蓝牙数据 获取服务ID 获取特征值 读取蓝牙数据 写蓝牙数据 遇到的坑 获取serviceId的坑 特征值不支持读写 notify成功后立刻写蓝牙数据 工具方法 前言 原因是公司要搞个共享单车给内部员工使用&#…

32位浮点数表示方法

今天开始给大家介绍计算机组成原理课程&#xff0c;本文主要内容是32位浮点数表示方法。 一、32位浮点数构成 32位浮点数是计算机中常见的一种数据类型&#xff0c;该数占据32bit空间&#xff0c;可以表示较大范围内的整数和小数。32位浮点数由三部分组成&#xff0c;分别是符…

Java集合List、Set、Map底层源码解析

目录集合介绍MapHashMapLinkedHashMapHashTablePropertiesCollectionListArrayListVectorLinkedListSetHashSetLinkedHashSetTreeSet集合介绍 为什么使用集合&#xff1f; 当我们想要保存一组数据时&#xff0c;可以使用到的变量类型有集合和数组。那么就像说一下数组的局限性…

1.9

完善案例 ​ this.$nextTick(function () {this.$refs.input.focus()})}​ //点击编辑直接获取焦点 this.$refs.input.focus() //但是这种写法 由于input是用v-show控制的 所以执行了上面代码 改变了isEdit值 但是不会立马去重新解析模板 input框还没有出来 //将handleedit回调…

springboot+xxl-job初体验

在日常开发中经常遇到任务调度的需求&#xff0c;下面体验一下分布式调度xxl-job。 1、常见定时任务的实现方式 Java自带的java.util.Timer类ScheduledExcutorServiceSpringboot自带的EnableScheduling注解Quartz框架Elastic-job框架XXL-JOB框架 下面对xxl-job实现任务调度尝…

【TypeScript】TS进阶-函数重载(七)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…