当前位置: 首页 > article >正文

# 02_Python基础到实战一飞冲天(三)-python面向对象(二)--初始化方法和内置方法

02_Python基础到实战一飞冲天(三)-python面向对象(二)–初始化方法和内置方法

一、初始化方法-01-在类的外部给对象增加属性的隐患

1、在类的外部给对象增加属性,会存在隐患。

1)如果先调用方法 再设置属性,观察一下执行效果,程序会报错。

tom = Cat()
tom.drink()
tom.eat()
tom.name = "Tom"
print(tom)

2)程序执行报错如下:

AttributeError: 'Cat' object has no attribute 'name'
属性错误:'Cat' 对象没有 'name' 属性

3)提示

  • 在日常开发中,不推荐在 类的外部 给对象增加属性。
    • 如果在运行时,没有找到属性,程序会报错
  • 对象应该包含有哪些属性,应该 封装在类的内部

2、在类的外部给对象增加属性的隐患 示例 代码(dzs_04_在类的外部设置属性的问题.py)

# dzs_04_在类的外部设置属性的问题.py

class Cat:
"""这是一个猫类"""

    def eat(self):
        # 由哪一个对象调用的方法,方法内的self就是哪一个对象的引用
        # print("小猫爱吃鱼")
        print("%s 爱吃鱼" % self.name)

    def drink(self):
        # print("小猫在喝水")
        print("%s 在喝水" % self.name)

tom = Cat()

# 可以使用 .属性名 利用赋值语句就可以了,但要定义在方法调用之前
tom.name = "Tom"

tom.drink()
tom.eat()
print(tom)
# 如果在下面才定义属性,程序会报错
# tom.name = "Tom"  #error

3、示例:

在这里插入图片描述

二、初始化方法-02-创建对象时自动调用初始化方法

1、初始化方法

1)当使用 类名() 创建对象时,会 自动 执行以下操作:

    1. 为对象在内存中 分配空间 —— 创建对象。
    1. 为对象的属性 设置初始值 —— 初始化方法(init)。

2)这个 初始化方法 就是 __init__ 方法,__init__ 是对象的内置方法

2、 __init__ 方法是 专门 用来定义一个类 具有哪些属性的方法

3、示例 代码(dzs_05_初始化方法.py):

Cat 类中增加 __init__ 方法,验证该方法在创建对象时会被自动调用。


# dzs_05_初始化方法.py

class Cat:
"""这是一个猫类"""

    def __init__(self):
        print("初始化方法")

# 使用类名() 创建对象的时候,会自动调用初始化方法 __init__
tom = Cat()

4、示例:

在这里插入图片描述

三、初始化方法-03-在初始化方法中定义属性

1、在初始化方法内部定义属性

1)在 __init__ 方法内部使用 self.属性名 = 属性的初始值 就可以 定义属性

2)定义属性之后,再使用 Cat 类创建的对象,都会拥有该属性。

2、初始化方法内部定义属性 示例 代码(dzs_05_初始化方法.py):

Cat 类中增加 __init__ 方法,验证该方法在创建对象时会被自动调用。


# dzs_05_初始化方法.py

class Cat:
"""这是一个猫类"""

    def __init__(self):

        print("这是一个初始化方法")

        # 定义用 Cat 类创建的猫对象都有一个 name 的属性
        self.name = "Tom"

    def eat(self):
        print("%s 爱吃鱼" % self.name)

# 使用类名() 创建对象的时候,会自动调用初始化方法 __init__
tom = Cat()
print(tom.name)
tom.eat()

3、示例:

在这里插入图片描述

四、初始化方法-04-使用参数设置属性初始值

1、改造初始化方法 —— 初始化的同时设置初始值

  • 在开发中,如果希望在 创建对象的同时,就设置对象的属性,可以对 __init__ 方法进行 改造

1)把希望设置的属性值,定义成 __init__ 方法的参数。
2)在方法内部使用 self.属性 = 形参 接收外部传递的参数。
3)在创建对象时,使用 类名(属性1, 属性2...) 调用。

2、初始化的同时设置初始值 示例 代码(dzs_06_利用参数设置属性初始值.py)

# dzs_06_利用参数设置属性初始值.py

class Cat:
"""这是一个猫类"""

    def __init__(self, new_name):

        print("初始化方法 %s" % new_name)
        # self.属性名 = 属性的初始值
        # self.name = “Tom”
        self.name = new_name

    def eat(self):
        print("%s 爱吃鱼" % self.name)

# 使用类名() 创建对象的时候,会自动调用初始化方法 __init__
tom = Cat("Tom")
print(tom.name)
tom.eat()

lazy_cat = Cat("大懒猫")
lazy_cat.eat()

3、示例:

在这里插入图片描述

五、内置方法-01-del方法和对象的生命周期

1、python内置方法和属性

__del__ 方法 :对象被从内存中销毁前,会被自动调用。
__str__ 方法 :返回对象的描述信息,print 函数输出使用。

2、 __del__ 方法(知道)

1)在 Python 中,当使用 类名() 创建对象时,为对象 分配完空间后,自动 调用 __init__ 方法。

2)当一个 对象被从内存中销毁 前,会 自动 调用 __del__ 方法。

3、应用场景

1) __init__ 改造初始化方法,可以让创建对象更加灵活。
2)__del__ 如果希望在对象被销毁前,再做一些事情,可以考虑一下 __del__ 方法。

4、生命周期

1)一个对象从调用 类名() 创建,生命周期开始。
2)一个对象的 __del__ 方法一旦被调用,生命周期结束。
3)在对象的生命周期内,可以访问对象属性,或者让对象调用方法。

5、__del__方法 示例 代码(dzs_07___del__方法.py)

# dzs_07___del__方法.py

class Cat:
"""这是一个猫类"""

    def __init__(self, new_name):

        self.name = new_name

        print("%s 来了" % self.name)

    def __del__(self):

        print("%s 去了" % self.name)

# tom 是一个全局变量
tom = Cat("Tom")
print(tom.name)

# del 关键字可以删除一个对象
del tom

print("-" * 50)

6、示例:

在这里插入图片描述

六、内置方法-02-str方法定制变量输出信息

1、 __str__ 方法

1)在 Python 中,使用 print 输出 对象变量,默认情况下,会输出这个变量 引用的对象由哪一个类创建的对象,以及 在内存中的地址十六进制表示)。

2)如果在开发中,希望使用 print 输出 对象变量 时,能够打印 自定义的内容,就可以利用 __str__ 这个内置方法了。

注意:__str__ 方法必须返回一个字符串。

2、__str__ 方法 示例 代码:

# dzs_08___str__方法.py

class Cat:

    def __init__(self, new_name):

        self.name = new_name

        print("%s 来了" % self.name)

    def __del__(self):

        print("%s 去了" % self.name)

    def __str__(self):
        return "我是小猫:%s" % self.name

tom = Cat("Tom")
print(tom)

3、示例:

在这里插入图片描述

七、小明爱跑步-01-封装特性和需求分析

1、面向对象封装案例 学习目标:

  • 封装
  • 小明爱跑步 案例
  • 存放家具 案例

2、封装

1)封装 是面向对象编程的一大特点。
2) 面向对象编程的 第一步 —— 将 属性方法 封装 到一个抽象的 中。
3)外界 使用 创建 对象,然后 让对象调用方法
4)对象方法的细节 都被 封装类的内部

提示:在 对象的方法内部,是可以 直接访问对象的属性 的!

3、小明爱跑步 案例 需求分析:

需求

1)小明 体重 75.0 公斤
2)小明每次 跑步 会减肥 0.5 公斤
3)小明每次 吃东西 体重增加 1 公斤

在这里插入图片描述

八、小明爱跑步-02-案例完成

1、小明爱跑步 案例 代码实现(dzs_09_小明爱跑步.py):

# dzs_09_小明爱跑步.py

class Person:
    """人类"""

    def __init__(self, name, weight):

		# self.属性 = 形参
        self.name = name
        self.weight = weight

    def __str__(self):

        return "我的名字叫 %s 体重 %.2f 公斤" % (self.name, self.weight)

    def run(self):
        """跑步"""

        print("%s 爱跑步,跑步锻炼身体" % self.name)
        self.weight -= 0.5

    def eat(self):
        """吃东西"""

        print("%s 是吃货,吃完这顿再减肥" % self.name)
        self.weight += 1


xiaoming = Person("小明", 75.0)

xiaoming.run()
xiaoming.eat()
xiaoming.eat()

print(xiaoming)

2、示例:

在这里插入图片描述

九、小明爱跑步-03-扩展-多个对象属性之间互不干扰

1、小明爱跑步 案例 扩展 —— 小美也爱跑步

1)需求

    1. 小明小美 都爱跑步
    1. 小明 体重 75.0 公斤
    1. 小美 体重 45.0 公斤
    1. 每次 跑步 都会减少 0.5 公斤
    1. 每次 吃东西 都会增加 1 公斤

2)类示意图

在这里插入图片描述

3)提示

    1. 对象的方法内部,是可以 直接访问对象的属性 的。
    1. 同一个类 创建的 多个对象 之间,属性 互不干扰!

在这里插入图片描述

2、小明爱跑步 案例 扩展:小美也爱跑步 示例 代码(dzs_10_小明爱跑步扩展.py

):

# dzs_10_小明爱跑步扩展.py

class Person:
    """人类"""

    def __init__(self, name, weight):

		# self.属性 = 形参
        self.name = name
        self.weight = weight

    def __str__(self):

        return "我的名字叫 %s 体重 %.2f 公斤" % (self.name, self.weight)

    def run(self):
        """跑步"""

        print("%s 爱跑步,跑步锻炼身体" % self.name)
        self.weight -= 0.5

    def eat(self):
        """吃东西"""

        print("%s 是吃货,吃完这顿再减肥" % self.name)
        self.weight += 1


xiaoming = Person("小明", 75.0)

xiaoming.run()
xiaoming.eat()

print(xiaoming)

xiaomei = Person("小美", 45)

xiaomei.run()
xiaomei.eat()

print(xiaomei)
print(xiaoming)

3、示例:

在这里插入图片描述

十、摆放家具-01-需求分析-被使用的类应该先开发

1、摆放家具案例 需求分析

需求

1)房子(House)户型总面积家具名称列表
* 新房子没有任何的家具。

2)家具(HouseItem)名字占地面积,其中
* 席梦思(bed) 占地 4 平米
* 衣柜(chest) 占地 2 平米
* 餐桌(table) 占地 1.5 平米。

3)将以上三件 家具 添加房子 中。

4)打印房子时,要求输出:户型总面积剩余面积家具名称列表

在这里插入图片描述

2、摆放家具案例 :房子剩余面积分析

1)在创建房子对象时,定义一个 剩余面积的属性初始值和总面积相等
2)当调用 add_item 方法,向房间 添加家具 时,让 剩余面积 -= 家具面积

3、思考:应该先开发哪一个类?

答案 —— 家具类

1)家具类简单
2)房子类要使用到家具类,被使用的类,通常应该先开发。

上一节关联链接请点击:

01_Python基础到实战一飞冲天(三)–python面向对象(一)–简单类


http://www.kler.cn/a/419690.html

相关文章:

  • MyBatis-Plus介绍及基本使用
  • 如何在鸿蒙API9和x86模拟器中使用MQTT
  • 昇腾CANN 8.0基于LLM P-D分离部署方案发布LLM-DataDist组件:高效低成本,简单易集成
  • 前端 如何用 div 标签实现 步骤审批
  • leetcode102:二叉树的层序遍历
  • 【力扣热题100】—— Day3.反转链表
  • xiaolin coding 图解 MySQL笔记——索引篇
  • Unity Ads常见问题:投放、变现、安装等注意事项
  • AI智护视听生活,飞利浦PUF8160震撼上市!
  • go的web框架介绍
  • Kafka2.2.0集群安装
  • Vue.js 与 TypeScript(3):tsconfig.json详细配置
  • 期末复习-Hadoop名词解释+简答题纯享版
  • 基于神经网络的弹弹堂类游戏弹道快速预测
  • 【机器学习】数据操作与数据预处理
  • 新手参加2025年CTF大赛——Web题目的基本解题流程
  • 界面控件DevExpress WPF v24.2新功能预览 - 人工智能(AI)集成
  • 网络安全技术详解:防火墙与入侵检测和防御系统(IDS/IPS)
  • 《C++ Primer Plus》学习笔记|第10章 对象和类 (24-12-2更新)
  • 【学习笔记】GoFrame框架