【Python】Python 中的面向对象编程思想

时间:2025-02-25 10:22:22

目录

面向对象基础

面向对象 / 面向过程

面向过程编程

面向对象基本概念

面向对象-类和对象

对象

类和对象的关系:

类的设计

定义类名

属性和方法的确定

面向对象基本语法

定义简单的类(只包含方法)

定义类

self的使用


面向对象基础

面向对象 / 面向过程

一个思想、理论、逻辑。 独立于变成语言。理论来源于生活 、来源于人类的思考方式。

面向对象:适合解决大型、 复杂业务的项目 面向接口 面向过程 面向切片

面向过程:

根据业务逻辑从上到下写代码。 项目中解决部分问题的方案

注重步骤与过程,不注重职责分工,代码会变得很复杂,没有套路,开发难度很大!

面向对象:

变量与函数绑定到一起,分类进行封装,每个程序 只要负责分配给自己的分类能更快 速的开发程序,减少重复代码。整体项目解决方法(化简逻辑,让代码更简单)

抽象的概念:

面向对象的思想就是抽象的思想即人类认识世界的思想 ​ 面向对象的过程就是抽象的过程即人类认识世界的过程

面向过程编程

不推荐使用(了解即可)

面向过程编程的关注点在于怎么做

把完成某一个需求的 所有步骤 从头到尾 逐步实现。

根据开发需求,将某些 功能独立 的代码 封装 成一个又一个 函数。

最后完成的代码,就是顺序地调用 不同的函数。

面向过程编程特点:

  • 注重步骤与过程,不注重职责分工。

  • 如果需求复杂,代码会变得很复杂。

  • 开发复杂项目,没有固定的套路,开发难度很大!

面向对象基本概念

编程思想 -- 面向对象 -->整体项目解决方案

面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)和面相过程编程,是两种不同的编程方式。

作用:

责任分发,变量与函数绑定到一起,分类进行封装,快速的开发程序,减少了重复代码。

面向对象程序设计 独立于编程语言。

每个程序只要负责分配给自己的分类 ;(社会的进步表现在 分工的越来越明确 )。

面向对象编程的关注点在于谁来做方法=函数=行为=动作。(责任分发)

相比较函数,面向对象是更大的封装,根据职责在 一个对象中封装多个方法。

在完成某一个需求前,首先确定职责 —— 要做的事情(方法)。

根据 职责 确定不同的 对象,在对象内部封装不同的方法(多个)。

最后完成的代码,就是顺序地调用不同对象的相应方法。

面向对象特点:

  • 注重 对象和职责,不同的对象承担不同的职责。(分则)

  • 更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路。

做一些工作 :要解决问题 就要模拟问题!

  1. 定义类:

    将我大脑中的概念转移到 python中。 ​ 就在python中 定义一个类型、一个类别、一个模板。 ​ 使用 class 关键字、保留字 定义类。

  2. 类属性:

​ 增强一下画像 、印象、特征(特别提醒:只描述 你自己业务的关注点) ​ 属性 = 特征 (类属性)

  1. 定义功能函数:

    责任 = 功能 = 能力 = 行为 = 能力 = 函数 ​ 定义函数: 面向对象中把 任 = 功能 = 能力 = 行为 = 能力 = 函数 。统统定义为函数。 ​ 定义函数 可以很复杂 也可以很简单。 ​ 因为 函数可以写逻辑代码 ,可以包含多行内容。

  2. 计算机属于先下定义 、在创建模板。

    在现实生活中 :当我们看见遇见一个 实物 的时候:大脑会不自觉的去匹配大脑中的模板。

  3. 语法问题 : 1. 创建对象 对象名 = 类名() 2. 访问属性 、方法 对象名.属性名 /方法名 3. 属性赋值 对象名.属性名 = 值

面向对象-类和对象

对象面向对象编程的两个核心概念。 注意:在开发中 ,先有类,再定义对象。

类:

        是对一系列具有相同 特征行为的一个统称,抽象的,不能直接使用(不是真是存在的实物)

类的作用:

类是用来创建对象的

类:是概念 比如说(猫类 ,狗类 等 )

类:是一个概念 谁都可以定义 (经常要使用而且经常要自定义) 一类 :一定是具有相同特的。

  • 特征就是一个变量,在类里我们称之为属性(特征即是属性:类似于 洗衣机的宽高)。

  • 行为就是一个函数,在类里我们称之为方法(行为即是方法:类似于 洗衣机的功能)。

  • 类其实就是由 属性 和 方法 组成的一个抽象概念。

    属性 和 方法 是抽象来的。 是你观察,发现的相同点。可以说 : ​ 属性与方法被类 封装起来了/保护起来了。(在python中 缩进代表着 包含的意思)

总结:

  • 类属对象的抽象出来的

  • 对象是类的实例出来的

  • 万物皆对象 物 --->>> 实实在在的物体

  • 对象(拥有属性和方法的集合体)

对象

什么是对象:

对象是由类实例化出来真实存在的事物,可以直接使用。例如:图纸造出飞机 电视 洗衣机...

由那一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。

类和对象的关系:

用类去创建一个对象 , 可以把创建称之为实例化 亦可以用类去实例化一个对象。

  • 类是模板,对象是根据类这个模板创建的应该先有类,再有对象。

  • 使用同一个类,能够创建出n多个对象。要符合 is a 的关系。

  • 类中定义了什么属性和方法,对象中就有什么属性和方法。

  • 不同对象对应的属性值也会不同。

类的设计

在程序开发中,要设计一个类,通常需要满足一下三个要素:

  1. 类名: 这类事物的名字,安照大驼峰命名法(每个单词的首字母大写)起名

  2. 属性: 这类事物具有什么样的特征。== 属性

  3. 方法: 这类事物具有什么样的行为。== 函数

定义类名

名词提炼法:分析整个业务流程,出现的名词,通常就是找到的类。(可以两个名词拼接成的缩写)

注意:类名要满足标识符命名规则,同事要遵守大驼峰的命名习惯。(首字母大写)

属性和方法的确定

对象的特征描述,可以定义成属性

对象具有的行为(动词)可以定义成方法

练习需求1:

  • 小明今年18 岁,身高 1.75,每天早上跑完步,会去 吃 东西

  • 小美今年17 岁,身高 1.65,小美不跑步,小美喜欢 吃 东西

class Person(object):
    """ 这是一个人类 """
    # 类属性
    name = ''
    age = '12'
    height = '1.0'
​
    # 功能函数
    def run(self):
        # 判断 
        if  == '小明':
            print('每天每天早上跑完步,会去 吃 东西')
        elif  == '小美':
            print('小美不跑步,小美喜欢 吃 东西')
​
    def showInfo(self):
        print(f'{}\t今年:{}\t身高:{}')
​
​
# 拦截 测试 
if __name__ == '__main__':
    ming = Person()
     = '小明'
    ()
    ()

面向对象基本语法

在Python中,对象几乎是无处不在的,一切接对象 ;使用dir内置函数来查看这个对象里的方法。

在python 处处皆对象。

# 可以使用`dir`内置函数来查看这个对象里的方法。
a = []
print(dir(a)) # ['__add__', '__class__', '__class_getitem__'....

定义简单的类(只包含方法)

面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象

对象名.方法/属性名 可以直接调用这些方法了!

什么是封装?

将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口

对外隐藏内部实现细节,并提供访问的接口

什么时候应该封装?

当有一些数据不希望外界可以直接修改时

当有一些函数不希望给外界使用时

为什么需要封装

1.为了保证 关键数据的安全性

2.对外部隐藏实现细节,隔离复杂度

定义类

手动添加属性 :对象名.属性名 = 赋值

获取 :类外面获取属性 print(对象名.属性名) 可以访问到值

类里面获取对象属性:self.属性名 = (属性名的值)

object -- 默认状态下 ,类不去继承自己书写得类 ,默认继承所有类的*类,就是object(父类,基类)

定义类中的方法

定义函数不要重名 一旦重名 调用的是最后一个(替换) ,也不要和类名重名。 ​ 命名规则 首字母小写其余单词首字母大写

# 方法里的第一个参数必须是self  、类名要遵守大驼峰命名法
class 类名(object):
    def 方法1(self,参数列表):
        pass
    def 方法2(self,参数列表):
        pass
​
​
class Dog(object):
    """ 这是一个狗类  """
    def run(self):
        print(f'{}在奔跑')
​
    def set(self):
        print('狗狗在吃东西')
​
    def playPan(self):
        print('狗狗在玩耍')
​
​
if __name__ == '__main__':
    xiaoHang = Dog()  # 创建新对象 就会开辟新空间
    '''
      Python语法特点:
         脚本语言 解释性语言 可以动态给对象添加属性
         给对象添加属性 是添加到了某一个对象身上并不会影响其他对象和类模板
        
    '''
    # 类外面添加属性 对象名.属性名 = 赋值
     = '小黄'
    ()
​
    xiaoHen = Dog()  # 创建新对象 就会开辟新空间
     = '小黑'
    ()
​
    print(xiaoHen == xiaoHang)
    print(id(xiaoHen))
    print(id(xiaoHang))
​

创建对象:

对象 又叫 实例(先有类 在创建对象)

对象名 = 类名()  # 类名() 等号赋值到 对象变量名 (变量名即使对象名)  

例子:

第一个面向对象代码

需求

  • 小猫 爱 吃 鱼,小猫 要 喝 水

分析

  • 定义一个猫类 Cat

  • 定义两个方法 eat 和 drink

  • 按照需求 —— 不需要定义属性

class Cat:
    """这是个猫类"""
​
    def eat(self):
        print("小猫在吃东西")
​
    def drink(self):
        print("小猫在喝水")
​
tom = Cat()           # 创建了一个Cat对象  开辟新空间
()
()
print(id(tom))    
​
hello_kitty = Cat()   # 又创建了一个新的Cat对象  开辟新空间
hello_kitty.eat()
hello_kitty.drink()
print(id(hello_kitty)) # 查看内存地址  id()将空间地址数值化

self的使用

给对象添加属性:python 是脚本语言.python支持动态属性,当一个对象创建好了以后,直接使用 对象.属性名 = 属性值 就可以很方便的给对象添加一个属性。(不建议使用这种方式给对象添加属性)

# 这种方法很方便,但是,不建议使用这种方式给对象添加属性。
tom = Cat()
 = 'Tom'  # 可以直接给 tom 对象添加一个 name 属性
self的概念

self 表示 本身,作为函数的第一个参数,python语法默认提供 ,代表 当前调用此函数的对象。

对象为:return.__new__(cls) 开辟的空间

哪个对象调用了方法,方法里的self指的就是谁。

通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。

class Cat:
    """这是个猫类"""
    '''
        self 代表调用这个函数的对象   
        没有定义属性值 ,通过self .  的形式调用这个对象的属性和函数
    '''
    
    def eat(self):
        print("小猫{}在吃东西".format())
        () # 使用self.方法名打印(drink内的方法内容)
​
def drink(self):
    print("小猫在喝水")
​
print('   ', __name__)
if __name__ == '__main__':
    tom = Cat()    # 创建了一个Cat对象
    ='汤姆' 
    ()
    print()
    print(id(tom))
​
​
    kt = Cat()
    ="花花"
    print()
    ()
​
这种方法很方便,但是,不建议使用这种方式给对象添加属性。
顺序掌握不好会报错 要注意先后顺序 (先定义属性,在调用)
​
"""
self是调用概函数的对象,打印对象内存地址,与打印self内存地址相同。
那个象调用了 washer方法 就会把 pi对象属性传入self 里面去
一个类 可以创建多个对象, 多个对象都调用方法函数(内存地址不同的)
创建一个对象调用方法 就会开辟新的空间
"""
​