两种编程思维

Posted m0_73505947

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两种编程思维相关的知识,希望对你有一定的参考价值。

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

就像在做项目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.学生姓名 + '的评级是:差')

[python]两种编程思维--面向过程和面向对象

例如:eg:炒一份西红柿鸡蛋

一、面向过程

面向过程的编程思维,如下

技术图片

二、面向对象

制作一台炒菜机器人,然后告诉机器人做一道西红柿炒鸡蛋。在这里,我们直接面对的是机器人,而非炒菜的过程,所以这里机器人就是我们面对的对象,这种解决问题的方法就叫做【面向对象】编程

技术图片

三、总结

【面向过程】编程主要用到的是“函数”知识,将每个过程步骤打包成函数,再依次调用,看重的是解决问题的过程

【面向对象】编程主要用到的是“类和对象”知识,看重的是解决问题的方法

以上是关于两种编程思维的主要内容,如果未能解决你的问题,请参考以下文章

养成编程思维,可以从python开始,今天说说python注释

Python基础知识思维导图|自学Python指南

python的思维逻辑怎么样?

Python入门基础01

ECMA6--面向对象

学Python要啥基础吗