当前位置: 首页 > news >正文

两种编程思维

面向过程编程,看重的是解决问题的过程。

就像在做项目2的时候,我们把一个PK游戏分解成了5个过程:

这种分析出解决问题所需要的步骤,然后按照这些步骤解决问题的方法,就是【面向过程】编程

【面向对象】

比如我们现在接到的一个需求是:做一道西红柿炒鸡蛋。

第一种方法是:自己按照炒菜的步骤亲手制作一道西红柿炒鸡蛋。

第二种方法是:制作一台炒菜机器人,然后告诉机器人做一道西红柿炒鸡蛋。

在这里,我们直接面对的是机器人,而非炒菜的过程,所以这里机器人就是我们面对的对象,这种解决问题的方法就叫做【面向对象】编程。

【面向过程】编程主要用到的是“函数”知识,将每个过程步骤打包成函数,再依次调用,还记得我们项目二用到的几个函数吗?

而【面向对象】编程主要用到的是“类和对象”知识。

一言以蔽之,【类】是【对象】的母板,得先有了类,我们才能制造各种“对象”。就像我们先有了产品图纸,才能制造各种产品一样。

所以,这一关我们先聚焦学习【类】,然后在下一关学习【类与对象】。

类是一个函数包

理解【类】最简单的方式:【类】是一个函数包。类中可以放置函数和变量,然后类中的函数可以很方便的使用类中的变量。

类中可以放置函数和变量

class 类A():
    def 函数1():
        print('报道!我是类A的第一个方法!')
    def 函数2():
        print('报道!我是类A的第二个方法!')
    def 函数3():
        print('报道!我是类A的第三个方法!')
        
类A.函数1()
类A.函数2()
类A.函数3()

class 类A():
    变量1 = 100
    变量2 = -5.83
    变量3 = 'abc'

# 这里需要用print语句,才能把提取出的数值打印到屏幕上
print(类A.变量1)
print(类A.变量2)
print(类A.变量3)

不过类中的属性(变量)也不是不能改变,使用类名.变量名的格式,可以让我们在类的外面,增加或修改类的属性:

类A.变量1 = 99
类A.变量4 = '新增一个变量'

print(类A.变量1)
print(类A.变量4)

我们为了让代码更直观,一般会把类中的函数和函数之间换行隔开,这不影响代码运行。

看到这里,你可能会有有点疑惑,类方法也是函数,那和我们之前学的单独定义函数有什么区别吗?
它们两者最大的区别,一个是它的调用格式:类.函数名()比函数名()多了一个【类.】,但更重要的是,“类”中的函数可以利用“类”中的变量(也就是类方法可以调用类属性)

@classmethod是声明了下面的函数是类方法,为什么要这么写呢?这就是我们接下来要讲的:

类方法和类属性可以组合

class 类A():
    变量1 = 100
    变量2 = 200

    @classmethod
    def 函数1(cls):
        print(cls.变量1)
        print(cls.变量2)

类A.函数1()

在这里,为了把类中的变量传递给类中的函数,我们需要用到3个特定格式:

① 第一个格式@classmethod的中文意思就是“类方法”,@classmethod声明了函数1是类方法,这样才能允许函数1使用类属性中的数据。
② 第二个格式cls的意思是class的缩写。如果类方法函数1想使用类属性(也就是类中的变量),就要写上cls为函数1的第一个参数,也就是把这个类作为参数传给自己,这样就能被允许使用类中的数据。
③ 第三个格式是cls.变量。类方法想使用类属性的时候,需要在这些变量名称前加上cls.。
这就好比类方法和类之间的约法三章,所以但凡有任何格式错误都会报错。
如果缺①,即缺了“@classmethod”,类方法就不能直接利用类中的属性,于是报错。(请运行代码,报错后,修改格式到正确的样式就能运行通过)

另外,当类中的函数【不需要】用到类中的变量时,就不要用@classmethod、cls、cls.三处格式,否则就是占着茅坑不拉屎,终端也会给你报错。(没错,就是这么傲娇~)

给类方法传参

类方法仅使用外部参数

一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']

def 念诗函数(参数):
    for i in 参数:
        print(i)

念诗函数(一首诗)

类方法仅使用内部参数

class 念诗类():
    一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
    
    @classmethod
    def 念诗函数(cls):
        for i in cls.一首诗:
            print(i)

念诗类.念诗函数()

类方法同时使用内部参数和外部参数

# 请直接运行并体验代码效果
class 加100类():
    变量 = 100
    
    @classmethod
    def 加100函数(cls,参数1,参数2,参数3):
        总和 = cls.变量 + 参数1 + 参数2 + 参数3
        print('加100函数计算结果如下:')
        print(总和)

参数1 = int(input('请输入一个整数:'))
参数2 = int(input('请输入一个整数:'))
参数3 = int(input('请输入一个整数:'))

加100类.加100函数(参数1,参数2,参数3)

增加/修改类属性

有两种途径来增加或修改类属性。一种是从内部,用类方法去增加/修改;另一种是从外部,用类.变量 = xx直接增加/修改类属性。

从外部增加/修改属性

class 类A():
    pass


类A.变量1 = 100
print(类A.变量1)

类A()是一个空类(里面的pass语句代表“什么都不做”),利用类A.变量1,我们在外部给类A()添加了一个类属性变量1,然后使用print语句把类属性打印了出来。

类A.变量1 = 100
print(类A.变量1)

变量1 = 15
#这是类外部的变量1
变量2 = 'abc'

class 类A():
    变量1 = 100
    #这是类属性变量1

变量1 = 类A.变量1
类A.变量2 = 变量2

print(类A.变量1)
print(类A.变量2)

class 类():
    @classmethod
    def 打印类属性(cls):
        print(cls.变量)

类.变量 = input('请输入字符串:')
类.打印类属性()

先利用input函数从外部接收了一个字符串,并通过赋值的方式保存为了类属性类.变量。然后利用类方法类.打印类属性()打印出了这个外部输入的字符串。

class 幸运():
    @classmethod
    def 好运翻倍(cls):
        print('好的,我把它存了起来,然后翻了888倍还给你:' + str(cls.幸运数*888))
        # 或者这样写也可以:
        # print('好的,我把它存了起来,然后翻了888倍还给你:%d' % (cls.幸运数*888))

幸运.幸运数 = int(input('你的幸运数是多少?请输入一个整数。'))
幸运.好运翻倍()

从内部增加/修改属性

class 类():
    @classmethod
    def 增加类属性(cls):
        cls.变量 = input('请随意输入字符串:')

类.增加类属性()

print('打印新增的类属性:')
print(类.变量)
终端(输入完毕后请按回车键)

class 念诗类():
    一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
    
    @classmethod
    def 念诗函数(cls,参数):
        print('念给'+ 参数 +'的诗:')
        for i in cls.一首诗:
            print(i)

念诗类.念诗函数('张三')

class 念诗类():
    一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
    
    @classmethod
    def 念诗函数(cls):
        cls.接收人 = input('请输入你想给谁念诗:')
        print('念给'+ cls.接收人 +'的诗:')
        for i in cls.一首诗:
            print(i)

念诗类.念诗函数()

class 成绩单():
    @classmethod
    def 录入成绩单(cls):
        cls.学生姓名 = input('请输入学生姓名:')
        cls.语文_成绩 = int(input('请输入语文成绩:'))
        cls.数学_成绩 = int(input('请输入数学成绩:'))

    @classmethod
    def 计算平均分(cls):
        平均分 = (cls.语文_成绩 + cls.数学_成绩)/2
        return 平均分

    @classmethod
    def 评级(cls):
        平均分 = cls.计算平均分()
        if 平均分>=90:
            print(cls.学生姓名 + '的评级是:优')
        elif 平均分>= 80 and 平均分<90 :
            print(cls.学生姓名 + '的评级是:良')
        elif 平均分>= 60 and 平均分<80 :
            print(cls.学生姓名 + '的评级是:中')
        else:
            print(cls.学生姓名 + '的评级是:差')

相关文章:

  • 图书馆管理系统(Java编写,思路及源代码)
  • 算法练习:动态规划(最长公共子串问题)
  • 【lm401】解决malloc动态申请内存时内存不足的问题
  • 【Python】ChineseCalendar包简介
  • 前端八股——JS高级学习
  • 【CSS系列】第二章 · CSS选择器
  • vue尚品汇商城项目-day04【27.分页器静态组件(难点)】
  • JavaScript技术干货第二弹,有需自取!
  • 华为OD机试用java实现 -【关联子串】
  • 走过最长的路是ChatGPT的套路,信过最真的话是Adobe的Firefly
  • 基于蓄电池进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实现)
  • 华为OD机试用Python实现 -【打折买水果】
  • 深入浅出 Fast DDS网络协议(入门篇)
  • 【简陋Web应用2】人脸检测——基于Flask和PaddleHub
  • 基于springboot实现数码论坛系统设计与实现演示【附项目源码+论文说明】
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • JAVA SE 6 GC调优笔记
  • JDK 6和JDK 7中的substring()方法
  • pdf文件如何在线转换为jpg图片
  • PHP变量
  • ReactNativeweexDeviceOne对比
  • React的组件模式
  • 机器学习 vs. 深度学习
  • 排序算法之--选择排序
  • 前端之React实战:创建跨平台的项目架构
  • 如何设计一个微型分布式架构?
  • 数据可视化之 Sankey 桑基图的实现
  • 用jquery写贪吃蛇
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #etcd#安装时出错
  • #Linux(权限管理)
  • #pragma 指令
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $NOIp2018$劝退记
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (function(){})()的分步解析
  • (Qt) 默认QtWidget应用包含什么?
  • (差分)胡桃爱原石
  • (二)springcloud实战之config配置中心
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .DFS.
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Reactor简单使用教程
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET基础篇——反射的奥妙
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • :“Failed to access IIS metabase”解决方法
  • @vue/cli 3.x+引入jQuery
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [<死锁专题>]