Python python 面向对象

打工人 · 2021年09月12日 · 最后由 底层贫困人员 回复于 2021年09月13日 · 3155 次阅读

面向过程与面向对象

面向过程编程

面向过程(procedural programming)就是程序从上到下一步步执行,从头到尾的解决问题,如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式最好

面向对象编程

面向对象(object-oriented Programming,简称 OOP)是利用 类 和 对象 来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因 一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率

Class 类

类是一类具有相同属性和方法的集合

Object 对象

一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象可以有不同的属性,就像人类是指所有人,每个人是具体的对象,人与人之间由共性,亦有不同

Encapsulation 封装

在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面保护着类的数据和方法
封装的优点:减少耦合;类内部的结构可以自由修改;对成员变量进行更精确的控制;隐藏实现细节

Inheritance 继承

一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承,继承分为 单继承和多继承
继承的优点:增加了类的耦合性;减少了重复代码;使得代码更加规范化、合理化

Polymorphism 多态

一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态
封装和继承的目的是为了实现代码的复用,而多态是为了实现接口重用,使得类在继承和派生的时候能够保证任何一个类的实例都能正确调用约定好的属性和方法

面向对象 vs 面向过程总结

  • 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤
    • 优点:极大的降低了写程序的复杂度,只需要顺序写,堆叠代码即可
    • 缺点:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身
  • 面向对象的程序设计的核心是对象
    • 优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中
    • 缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程和结果,面向对象的程序一旦开始就由对象之间的交互解决问题

类的定义

class Dog:      # 类名首字母要大写,驼峰体

    d_type = "京巴"   # 公共属性,又称类变量

    def __init__(self, name, age):      # 初始化函数,只要一实例化,就会自动执行
        self.name = name            # self.name 就是实例自己的变量
        self.age = age

    def say_hi(self):           # 类方法,必须带一个self参数,代表实例本身
        # 想要调用类里的属性,都有加上self
        print("dog name is %s" % self.name)

d = Dog('maomao', 2)    # 生成一个狗的实例
d2 = Dog('dandan', 3)

d.say_hi()      # 调用类方法
d2.say_hi()

print(d.name, d.age)        # 调用实例的变量
print(d.d_type)             # 调用类的变量

# 属性的增删改查
class Person:
    nationality = "chinese"
    addr = "北京"

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


# 实例属性操作
p = Person('Alex', 20, 'Male')
p.name = 'Bob'      # 修改属性
p.job = 'CEO'       # 添加实例属性
del p.sex           # 删除实例属性
print(p.job)        # 打印添加的实例属性

# 类属性操作
Person.nationality = "USA"  # 类属性修改
Person.race = "Yellow"      # 类属性添加
del Person.addr             # 删除类属性
print(p.addr)               # 再调用已删除的类属性就会报错

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

学习了,谢谢分享。

学习了,谢谢分享。

学习了,谢谢分享。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册