• Python面向对象


    💕💕💕 博主昵称:摆烂阳💕💕💕

    🥰博主主页跳转链接
    👩‍💻博主研究方向:渗透测试 、python编程
    📃 博主寄语:希望本篇文章能给大家带来帮助,有不足的地方,希望友友们给予指导

    本篇目标

    • 理解面向对象
    • 类和对象
    • 添加和获取对象熟悉
    • 魔法方法

    一、理解面向对象

    面向对象就是将编程当成一种事物,对于外界,事物是可以直接使用的,不用管内部的具体实现步骤,而我们编程就是设置这个事物可以做什么。

    打个比方,若在某游戏中设计一个乌龟的角色,应该如何来实现呢?使用面向对象的思想会更简单,可以分为如下两个方面进行描述:

    1、从表面特征来描述,例如,绿色的、有 4 条腿、重 10 kg、有外壳等等。
    2、从所具有的的行为来描述,例如,它会爬、会吃东西、会睡觉、会将头和四肢缩到壳里,等等。

    如果将乌龟用代码来表示,则其表面特征可以用变量来表示,其行为特征可以通过建立各种函数来表示。参考代码如下所示:

    class tortoise:
        bodyColor = "绿色"
        footNum = 4
        weight = 10
        hasShell = True
        #会爬
        def crawl(self):
            print("乌龟会爬")
        #会吃东西
        def eat(self):
            print("乌龟吃东西")
        #会睡觉
        def sleep(self):
            print("乌龟在睡觉")
        #会缩到壳里
        def protect(self):
            print("乌龟缩进了壳里")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二、类和对象

    类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 tortoise 表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。

    对象:类并不能直接使用,通过类创建出的实例(又称对象)才能使用。这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。

    属性:类中的所有变量称为属性。例如,tortoise 这个类中,bodyColor、footNum、weight、hasShell 都是这个类拥有的属性。

    方法:类中的所有函数通常称为方法。不过,和函数所有不同的是,类方法至少要包含一个 self 参数(后续会做详细介绍)。例如,tortoise 类中,crawl()、eat()、sleep()、protect() 都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。

    面向对象编程中两个重要的组成部分: 类 和 对象

    类和对象的关系:类产生对象 ----》 实例化

    1、理解类和对象

    1.1 类

    数据: 就是变量 ======》 类中叫属性

    功能: 就是函数 ======》 类中叫方法

    类就是一系列具有相同特征行为的事物的统称,是一个抽象化概念,不是真实存在的事物。

    • 特征即是属性
    • 行为即是方法

    1.2 对象

    对象就类创建出来的真实存在的事物

    注意:开发中,先有类,再有对象

    类是抽象的,对象是具体的

    一个类可以有多个对象

    类是一系列对象的集合

    类和类之间行为不同,对象与对象之间数据不同。

    2、面向对象实现方法

    2.1 定义类

    • 语法
    # 定义函数
    def 函数名():
    	函数体
    	
    	
    # 定义类
    class 类名():
    	代码
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:类名要满足标识符规则,同时遵循大驼峰命名规则

    class Washer():
        def wash(self):  # 实例方法
            print('洗衣服===')
    
    
    • 1
    • 2
    • 3
    • 4

    2.2 创建对象

    • 语法:
      • 对象名=类名() # 类的实例化
    # 洗衣机   洗衣服
    class Washer():
        def wash(self):  # 实例方法
            print('洗衣服===')
    
    
    # 创建对象
    # xiaotiane = Washer()
    # print(xiaotiane)
    
    # 验证功能    在类中叫实例方法/对象方法     -----  对象名.实例方法名()
    # xiaotiane.wash()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.3 self

    self指的就是调用该实例方法的对象

    # 洗衣机   洗衣服
    class Washer():
        def wash(self):  # 实例方法
            print(self)  # self指的是调用该方法的实例对象
            print('洗衣服===')
    
    
    xiaotaine = Washer()
    print(xiaotaine)
    xiaotaine.wash()
    
    
    xiaotaine1 = Washer()
    print(xiaotaine1)
    xiaotaine1.wash()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    三、添加和获取对象属性

    对象属性可以在类里面添加,也可以在类外面添加。

    1、类外面添加对象属性

    • 语法:
    对象名.属性名 =class Washer():
        def wash(self):
            print('洗衣服')
    
    
    xiaotiane = Washer()
    xiaotiane.wash()
    # 添加属性
    xiaotiane.height = 1000  # 高
    xiaotiane.width = 500  # 宽
    
    # 获取属性
    print(xiaotiane.width)
    print(xiaotiane.height)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2、类里面获取属性

    class Washer():
        def wash(self):
            print('洗衣服')
    
        def print_info(self):
            """获取属性"""
            print('洗衣机的高度是:', self.height)
    
    
    xiaotiane2 = Washer()
    # xiaotiane.wash()
    # xiaotiane2.print_info()
    # 添加属性
    xiaotiane2.height = 1000  # 高
    xiaotiane2.width = 500  # 宽
    xiaotiane2.print_info()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    四、魔法方法

    在Python中,__xx__()的方法就叫魔法方法,指的是具有特殊功能的方法。

    1、 __init__()方法

    class Washer():
        def __init__(self):  # 初始化魔法方法
            # 添加属性
            print('这是初始化魔法方法')
            self.height = 1000
            self.width = 300
    
        def print_info(self, name):
            """获取属性"""
            print('洗衣机的高度是:', self.height)
            print(name)
    
    
    xiaotiane = Washer()
    xiaotiane.print_info('nihao')
    
    
    xiaotiane1 = Washer()
    xiaotiane1.print_info('dajiahao')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    注意:__init__()方法,在创建对象的时候就会被默认调用,不需要手动调用,self参数不需要传递的,Python解释器会自动吧当前对象的引用传递过去。

    注意:init魔法方法 注意不要写成int魔法方法,不要多下划线和少下划线

    1.1 带参数的init魔法方法

    需求:一个类中有多个对象,如何对多个对象设置不同的属性值

    传参

    class Washer():
        def __init__(self, height, width):  # 初始化魔法方法
            # 添加属性
            self.height = height
            self.width = width
    
        def print_info(self):
            """获取属性"""
            print('洗衣机的高度是:', self.height)
            print('洗衣机的高度是:', self.width)
    
    
    xiaotiane = Washer(1000, 300)
    xiaotiane.print_info()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、str魔法方法

    当print输出一个对象的时候,默认打印的是对象的内存空间地址,如果在类中定义了str魔法方法之后,那么此时在打印对象的时候就是打印的这个方法的返回值。

    class Washer():
        def wash(self):
            print('洗衣服===')
    
        def __str__(self):  # 类的说明或者类的状态
            return '这是洗衣机的使用说明'
    
    
    xiaotiane = Washer()
    print(xiaotiane)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、del魔法方法

    当删除一个对象的时候,Python解释器会自动调用del魔法方法

    class Washer():
        def wash(self):
            print('洗衣服===')
    
        def __del__(self):
            """删除对象"""
            print(f'{self}对象已经被删除')
    
    
    xiaotiane = Washer()
    # del xiaotiane
    print(xiaotiane)
    
    
    class Washer():
        def __init__(self, height, width):  # 初始化魔法方法
            # 添加属性
            self.height = height
            self.width = width
    
        def print_info(self):
            """获取属性"""
            print('洗衣机的高度是:', self.height)
            print('洗衣机的高度是:', self.width)
    
    
    xiaotiane = Washer(1000, 500)
    # print(id(xiaotiane.height))
    print(id(xiaotiane.print_info()))
    
    xiaotiane2 = Washer(2000, 300)
    # print(id(xiaotiane2.height))
    print(id(xiaotiane2.print_info()))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    注意:

    • 如果一个类有多个对象,每个对象的属性是各自独立保存的,都是独立的地址。
    • 但是实例方法是所有对象所共享的,只占用一份内存空间,类会通过self参数来判断是那个对象调用了该实例方法。

    五、综合案例

    烤牛肉串儿

    1、需求

    被烤的时间和牛肉串儿的状态

    【 0-2:生的
    2-5: 5分数
    5-8: 全熟
    8分钟以上:糊了】

    添加作料

    【可以根据用户喜好添加作料】

    2、步骤分析

    涉及到一个事物:牛肉 抽象出来一个类

    3、 实现代码

    定义类

    • 牛肉的属性
      • 牛肉的状态
      • 被烤的时间
      • 添加的作料
    • 牛肉的方法
      • 被烤
        • 用户要指定烤的时间
        • 查看牛肉的状态,并且随着时间改变牛肉的状态
      • 添加作料
        • 用户想添加什么就添加什么
        • 保存用户添加的作料
    • 显示牛肉的状态
    class Beef():
        def __init__(self):
            # 被烤的时间
            self.cook_time = 0
            # 状态
            self.cook_state = '生的'
            # 添加的作料
            self.condiments = []
    
        def cook(self, time):
            """烤牛肉"""
            self.cook_time += time
            if 0 < self.cook_time <= 2:
                self.cook_state = '生的'
            elif 2 < self.cook_time <= 5:
                self.cook_state = '5分熟'
            elif 5 < self.cook_time <= 8:
                self.cook_state = '全熟'
            elif self.cook_time > 8:
                self.cook_state = '糊了'
    
        def add_condiments(self, condiment):
            """添加作料"""
            self.condiments.append(condiment)
    
        def __str__(self):
            return f"这个牛肉串被烤的总时间是{self.cook_time}, 状态是{self.cook_state}, 添加的作料有{self.condiments}"
    
    
    niurou = Beef()
    print(niurou)
    niurou.cook(1)
    print(niurou)
    niurou.cook(2)
    print(niurou)
    niurou.add_condiments('孜然')
    niurou.add_condiments('胡椒粉')
    print(niurou)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    8、【STM32】定时器(TIM)——中断、PWM、输入捕获实验(一文精通定时器)
    java中switch同if关键字的不同之处
    [蓝桥杯2020初赛] 门牌制作与既约分数与蛇形填数
    【分布式锁篇】Redisson详解
    嵌入式基础——哈弗结构
    前端基础 - 数据类型篇(高频面试!!!)
    tomcat总结
    uni-app ——uni-app的基本使用
    【算法题】901. 股票价格跨度
    秒验丨Android端SDK API使用说明
  • 原文地址:https://blog.csdn.net/qinshuoyang1/article/details/128187566