面向过程(函数)和对象(类)

发布时间 2024-01-12 21:29:15作者: 蓝幻ﹺ

【一】面向过程 (函数)

  • 核心在于:过程
  • 过程其实就是将程序流程化
  • 可以说是一条流水线,分步骤的解决问题,先干什么再干什么,分的很清楚

优点

  • 复杂度的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)

缺点

  • 一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。

【二】面向对象 (类)

  • 面向过程,核心在于“对象”二字
  • 对象的终极奥义就是将程序 “整合”
  • 对象就是 “容器” ,用来盛放数据与功能

优点

  • 解决了程序的扩展性。
  • 对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

缺点

  • 编程的复杂度远高于面向过程,不了解面向对象而立即上手基于它设计程序,极容易出现过度设计的问题。
    • 一些扩展性要求低的场景使用面向对象会徒增编程难度,比如管理linux系统的shell脚本就不适合用面向对象去设计,面向过程反而更加适合。
  • 无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法准确地预测最终结果。

【三】类与对象

  • 类即类别/种类,是面向对象分析和设计的基石,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。
  • 有了类的好处是:
    • 我们可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。
  • 所以,如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个对象相同的数据与功能的容器。

img

  • 综上所述,虽然我们是先介绍对象后介绍类,但是需要强调的是:
    • 在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)。
    • 产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能
    • 所以类中的内容仍然是属于对象的,类只不过是一种节省空间、减少代码冗余的机制
  • 面向对象编程最终的核心仍然是去使用对象。

【四】什么是类

  • 类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体

  • 所以,先有鸡和先有蛋的问题就出来了

    • 先有的一个个具体存在的对象(比如一个具体存在的人)
    • 还是先有的人类这个概念,这个问题需要分两种情况去看
  • 在现实世界中:先有对象,再有类

  • 在程序中:务必保证先定义类,后产生对象

【五】类的定义

class People:
    school = '清华大学'

    def __init__(self, name):
        self.name = name

    def read(self):
        print(f'可以读书')

【六】查看和修改类的属性

实例化类得到类对象

a = People('qc')

对象实例.方法

a.read()  # 可以读书

类名.属性 获取到属性的值

print(a.school)  # 清华大学

修改对象的属性

a = People('qc')
a.school = 'ss'
print(a.school)  # 清华大学
a.name = 'cat'
print(a.name)  # cat

【七】类的特殊属性

  • 类名.__name__ :类的名字(字符串)
  • 类名.__doc__:类的文档字符串
  • 类名.__base__:类的第一个父类(在讲继承时会讲)
  • 类名.__bases__:类所有父类构成的元组(在讲继承时会讲)
  • 类名.__dict__:类的字典属性
  • 类名.__module__:类定义所在的模块
  • 类名.__class__:实例对应的类(仅新式类中)
class People:
    '''这是注释'''

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def run(self):
        print(f"{self.name} 跑")


# 类名.__name__:类的名字(字符串)
print(People.__name__)
# People

# 类名.__doc__:类的文档字符串
print(People.__doc__)
# 这是注释

# 类名.__base__:类的第一个父类(继承)
print(People.__base__)
# <class 'object'>

# 类名.__bases__:类所有父类构成的元组(继承)
print(People.__bases__)
# (<class 'object'>,)

# 类名.__dict__:类的字典属性
print(People.__dict__)
# {'__module__': '__main__', '__doc__': '这是注释', '__init__': <function People.__init__ at 0x000001FC78D19B80>, 'run': <function People.run at 0x000001FC78D19C10>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>}

# 类名.__module__:类定义所在的模块
print(People.__module__)
# __main__

# 类名.__class__:实例对应的类(仅新式类中)
print(People.__class__)
# <class 'type'>