随笔 - 363, 文章 - 0, 评论 - 2, 阅读 - 23万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

10面向对象-类的基本使用

Posted on   心默默言  阅读(262)  评论(0编辑  收藏  举报

目录

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

1.1  定义只包含方法的类

1.2 创建对象

1.3  第一个面向对象程序

2.  方法中的 self 参数 

2.1  给对象增加属性

2.2  使用 self 在方法内部输出每一只猫的名字

3.  初始化方法

3.1  之前代码存在的问题 ---- 在类的外部给对象增加属性

3.2  初始化方法

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

3.4  改造初始化方法 ---- 初始化的同时设置初始值

4.  内置方法和属性

4.1 __del__方法

4.2  __str__方法

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

面向对象 是 更大 的 封装, 在 一个类中 封装 多个方法, 这样 通过这个类创建出来的对象, 就可以直接调用这些方法了!

1.1  定义只包含方法的类

    • 在 Python 中要定义一个只包含方法的类,  语法格式如下:



1 class 类名:
2     
3     def 方法1(self, 参数列表):
4         pass
5  
6     def 方法2(self, 参数列表):
7         pass
  • 方法 的定义格式和之前学习过的 函数 几乎一样
  • 区别在于第一个参数必须是 self 

1.2 创建对象

    • 当一个类定义完成之后,  要使用这个类来穿件对象,  语法格式如下
对象变量 = 类名()

1.3  第一个面向对象程序

需求

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

分析

    1. 定义一个猫类 Cat
    2. 定义两个方法 eat 和 drink
    3. 按照需求 ---- 不需要定义属性
复制代码
 1 class Cat:
 2     """这是一个猫类"""
 3  
 4     def eat(self):
 5         print("小猫爱吃鱼")
 6  
 7     def drink(self):
 8         print("小猫要喝水")
 9  
10  
11 # 创建猫对象
12 tom = Cat()
13 tom.eat()
14 tom.drink()
复制代码

引用概念的强调

在面向对象开发中, 引用的概念是同样适用的!

  • 在 Python 中使用类 创建对象之后,  tom 变量中 仍然记录的是 对象在内存中的地址
  • 也就是 tom 变量 引用 了 新建的猫对象
  • 使用 print 输出 对象变量,  默认情况下,  是能够输出这个变量 引用的对象 是哪一个类创建的对象,  以及 在内存中的地址 (十六进制表示)

 

提示 : 在计算机中,  通常使用 十六进制 表示 内存地址

    • 十进制 和 十六进制 都是用来表达数字的, 只是表示的方式不一样
    • 十进制 和 十六进制 的数字之间可以来回转换
  • %d 可以以 10 进制 输出数字
  • %x 可以以 16 进制 输出数字

案例进阶 ---- 使用 Cat 类再创建一个对象

1 lazy_cat = Cat()
2 lazy_cat.eat()
3 lazy_cat.drink()

提问: tom 和 lazy_cat 是同一个对象吗?  不是!

2.  方法中的 self 参数 

2.1  给对象增加属性

  • 在 Python 中, 要 给对象设置属性, 非常的容易, 但是不推荐使用
  • 因为: 对象属性的封装应该封装在类的内部
  • 只需要在 类的外部的代码 中直接通过 . (点) 设置一个属性即可

注意: 这种方式虽然简单,  但是不推荐使用!

1 tom.name = "Tom"
2  
3 lazy_cat.name = "大懒猫"

2.2  使用 self 在方法内部输出每一只猫的名字

由 哪一个对象 调用的方法,  方法内的 self 就是 哪一个对象的引用

  • 在类封装的方法内部,  self  就表示 当前调用方法的对象自己
  • 调用方法时,  程序员不需要传递 self 参数
  • 在方法内部

可以通过 self.  访问对象的属性

也可以通过 self.  调用其他的对象方法

复制代码
 1 class Cat:
 2     """这是一个猫类"""
 3  
 4     def eat(self):
 5  
 6         print("%s 爱吃鱼" % self.name)
 7  
 8     def drink(self):
 9  
10         print("%s 要喝水" % self.name)
11  
12  
13 # 创建猫对象
14 tom = Cat()
15 tom.name = "Tom"
16 tom.eat()
17 tom.drink()
18  
19 print(tom)
20  
21 # 再创建一个猫对象
22 lazy_cat = Cat()
23 lazy_cat.name = "大懒猫"
24 lazy_cat.eat()
25 lazy_cat.drink()
26  
27 print(lazy_cat)
28  
复制代码
  • 在 类的外部,  通过  变量名. 访问对象的 属性和方法
  • 在 类封装的方法中,  通过 self.  访问对象的 属性和方法

3.  初始化方法

3.1  之前代码存在的问题 ---- 在类的外部给对象增加属性

  • 将案例代码进行调整,  先调用方法 再设置属性,  观察以下执行效果
1 tom = Cat()
2 # tom.name = "Tom"
3  
4 tom.eat()
5 tom.drink()
6 tom.name = "Tom"
7  
8 print(tom)
  • 程序报错
AttributeError: 'Cat' object has no attribute 'name'

提示

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

3.2  初始化方法

  • 当使用  类名()  创建对象时,  会  自动  执行以下操作:
  1. 为对象在内存中 分配空间 ---- 创建对象
  2. 为对象的属性 设置初始值 ---- 初始化方法(init)
  • 这个 初始化方法 就是 __init__ 方法,  __init__是对象的 内置方法

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

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

复制代码
1 class Cat:
2     """这是一个猫类"""
3  
4     def __init__(self):
5  
6         print("这是一个初始化方法")
7  
8 # 使用类名()创建对象的时候, 会自动调用初始化方法
9 tom = Cat()
复制代码

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

  • 在 __init__ 方法内部使用 self.属性名 = 属性的初始值 就可以 定义属性
  • 定义属性之后,  再使用 Cat 类创建的对象,  都会拥有该属性
复制代码
 1 class Cat:
 2     """这是一个猫类"""
 3  
 4     def __init__(self):
 5  
 6         print("这是一个初始化方法")
 7  
 8         # self.属性名 = 属性的初始值
 9         self.name = "Tom"
10  
11     def eat(self):
12  
13         print("%s 爱吃鱼" % self.name)
14  
15  
16 # 使用类名()创建对象的时候, 会自动调用初始化方法
17 tom = Cat()
18  
19 tom.eat()
复制代码

3.4  改造初始化方法 ---- 初始化的同时设置初始值

  • 在开发中,  如果希望在 创建对象的同时,  就设置对象的属性,  可以对__init__方法进行 改造
  1. 把希望设置的属性值,  定义成 __init__ 方法的参数
  2. 在方法内部使用 self.属性 = 形参 接收外部传递的参数
  3. 在创建对象时,  使用 类型(属性1, 属性2...) 调用
复制代码
 1 class Cat:
 2     """这是一个猫类"""
 3  
 4     def __init__(self, new_name):
 5  
 6         print("这是一个初始化方法")
 7  
 8         # self.属性名 = 属性的初始值
 9         self.name = new_name
10  
11     def eat(self):
12  
13         print("%s 爱吃鱼" % self.name)
14  
15  
16 # 使用类名()创建对象的时候, 会自动调用初始化方法
17 tom = Cat("Tom")
18  
19 lazy_cat = Cat("大懒猫")
复制代码

4.  内置方法和属性

序号方法名类型

作用

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



4.1 __del__方法

  • 在 Python 中
  1. 当使用 类名() 创建对象时,  为对象 分配完空间 后,  自动 调用 __init__方法
  2. 当一个 对象被从内存中销毁 前,  会 自动 调用 __del__ 方法
  • 应用场景
  1. __init__ 改造初始化方法,  可以让创建对象更加灵活
  2. __del__如果希望在对象被销毁前,  再做一些事情,  可以考虑一下 __del__方法
  • 生命周期
  1. 一个对象从调用 类名( ) 创建,  生命周期开始
  2. 一个对象的 __del__ 方法一旦被调用,  生命周期结束
  3. 在对象的生命周期内,  可以访问对象属性,  或者让对象调用方法
复制代码
 1 class Cat:
 2  
 3     def __init__(self, new_name):
 4         # self.属性名 = 属性的初始值
 5         self.name = new_name
 6  
 7         print("%s 来了" % self.name)
 8  
 9     def __del__(self):
10  
11         print("%s 走了" % self.name)
12  
13  
14 # tom是全局变量,会在分割线下执行del方法
15 tom = Cat("Tom")
16  
17 # 使用 del 关键字可以删除一个对象, 销毁了, 就会在分隔线之前执行
18 # del tom
19  
20 print("-" * 50)
复制代码

4.2  __str__方法

  • 在 Python 中,  使用 print 输出 对象变量,  默认情况下,  会输出这个变量  引用的对象 是 由哪一个类创建的对象,   以及 在内存中的地址 (十六进制表示)
  • 如果在开发中,  希望使用 print 输出 对象变量 时,  能够打印 自定义的内容,  就可以利用 __str__这个内置方法了
注意: __str__ 方法必须返回一个字符串
复制代码
 1 class Cat:
 2  
 3     def __init__(self, new_name):
 4  
 5         self.name = new_name
 6  
 7         print("%s 来了" % self.name)
 8  
 9     def __del__(self):
10  
11         print("%s 走了" % self.name)
12  
13     def __str__(self):
14  
15         # 必须返回一个字符串
16         return "我是一只猫%s" % self.name
17  
18  
19 # tom是全局变量,会在分割线下执行del方法
20 tom = Cat("Tom")
21 print(tom)
22  
23 # 打印结果
24 # Tom 来了
25 # 我是一只猫Tom
26 # Tom 走了
复制代码

 

 

 

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示