生命在于学习——Python人工智能原理(2.5.1)

五、Python的类与继承

5.1 Python面向对象编程

在现实世界中存在各种不同形态的事物,这些事物之间存在各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象之间的关系描述事物之间的联系,这种思想用在编程中就是面向对象编程。

(1)面向对象编程的含义

面向对象编程,简称oop,是一种编程范例。它提供了一种结构化程序的方法,以便将属性和行为捆绑到单个对象中。

(2)类与对象定义

对象是一个抽象概念,将对象划分为两个部分,即静态部分和动态部分,静态部分被称为属性,任何对象都具备自身属性,这些不仅是客观存在的,而且是不能忽视的。

类是封装对象的属性和行为的载体,对象是类的示例。

(3)面向对象的特征

面向对象程序设计有三大基本特征:封装、继承、多态。

封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类。

(4)面向对象与面向过程编程的区别

面向过程思想在早期开发语言中大量使用,它是分析出解决问题的步骤,然后用函数将这些步骤一一实现,使用的时候另行调用,面向过程只考虑在函数中封装代码逻辑,不考虑函数的归属关系。

(5)类的定义与使用

a、定义

在Python中,类表示具有相同属性和方法的对象集合,在使用类时,需要先定义类,然后再创建类的实例,类的定义使用class关键字实现,默认有init方法。

python 复制代码
class dog:
	def _init_(self,name,age):
		self.name = name
		self.age = age
	def bark(self):
		print("woof!")
#创建类的实例
my_dog = Dog(name="Buddy",age=3)
#访问对象的属性
print(my_dog.name)#输出:buddy
#调用对象的方法
my_dog.bark()#输出:woof!

b、使用

通过实例化类来创建对象,并通过对象访问属性和调用方法,在上面的例子中,Dog类定义了一个狗的对象,具有name和age两个属性以及bark方法,通过创建my_dog对象,我们可以访问其属性和调用其方法。

5.2 属性和方法的定义和使用

(1)创建类与对象

a、属性

属性用于描述事物的特征,如颜色、大小、数量等。可以分为类属性和对象属性。类的属性存储了类的各种数据,定义位置有类的内部和方法的外部,由该类所有的对象共同拥有。类属性可以通过类名访问,也可以通过对象名访问,但只能通过类名修改。

python 复制代码
class Dog:
	count = 0

	def _init_(self,name,age)
		self.name = name
		self.age = age
		Dog.count += 1 #在初始化时增加count的值
	def bark(self):
		print("Woof!")
	在类中,属性是对象的特征或数据,属性通常在构造方法中初始化,并通过self关键字来引用。
b、python的内置类属性
  1. dict : 类的属性(包含一个字典,由类的数据属性组成)
  2. doc :类的文档字符串
  3. name: 类名
  4. module : 类定义所在的模块(类的全名是'main .className',如果类位于一个导入模块mymod中,那么className.module
    等于 mymod)
  5. bases : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
c、对象属性

对象属性是对象特征的描述,定义非常灵活,可在方法内部定义,也可在调用实例时添加如scf.name和self.age都是对象属性。私有属性也是一种对象属性。

d、私有属性

在实例变量self前加单个下划线,以保护变量,变量并不是真正的受保护,这只是Python开发者的约定,在看到单个前置下划线的变量时,并不会尝试访问和修改它,双前置下划线会让Python解释器重写属性的名称,以达到保护变量的目的。

e、构造函数

介绍:

构造函数(也称为初始化方法)是一个特殊的方法,当创建类的新实例时会自动调用。在Python中,构造函数的名称是__init__。

代码示例:

python 复制代码
class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
p = Person("Alice", 30)  
print(p.name)  # 输出: Alice  
print(p.age)   # 输出: 30
f、析构函数

介绍:

析构函数在对象被销毁前(例如,对象被垃圾回收)调用,用于执行清理操作,如关闭文件或释放资源。在Python中,没有显式的析构函数,但可以使用__del__方法作为析构函数的类似物。然而,由于Python的垃圾回收机制,__del__方法并不总是会被调用。

代码示例(虽然不推荐依赖__del__进行资源清理):

python 复制代码
class MyClass:  
    def __del__(self):  
        print("对象被销毁")  
  
# 创建一个对象,但在大多数情况下,我们不会看到"对象被销毁"的输出  
obj = MyClass()
g、对象方法

介绍:

对象方法是类的实例可以调用的方法。它们通常用于操作实例的状态。

代码示例:

python 复制代码
class Circle:  
    def __init__(self, radius):  
        self.radius = radius  
  
    def area(self):  
        return 3.14 * self.radius ** 2  
  
circle = Circle(5)  
print(circle.area())  # 输出圆的面积
h、私有方法

介绍:

Python没有真正的私有方法或属性,但有一种约定俗成的做法是使用双下划线前缀来表示"私有"成员。然而,这只是一个命名约定,Python仍然可以从外部访问这些成员。真正的"私有"性是通过其他机制(如属性装饰器)实现的。

代码示例:

python 复制代码
class MyClass:  
    def __private_method(self):  
        print("这是一个'私有'方法")  
  
    def public_method(self):  
        self.__private_method()  # 类的内部可以调用它  
  
# 但仍然可以从外部"访问"它(尽管不推荐)  
obj = MyClass()  
obj._MyClass__private_method()  # 注意这里的命名转换
i、Python内置类方法

Python的内置方法(也称为魔法方法或双下划线方法)确实非常多,它们提供了丰富的功能和定制性。这里是一些常用的内置方法的补充,以及它们的简要说明和示例:

python 复制代码
1. 初始化与销毁
__init__(self, ...): 构造函数,初始化对象时调用。
__del__(self): 析构函数,对象被销毁前调用(但通常不推荐在__del__中执行重要清理工作)。
2. 字符串与表示
__str__(self): 返回对象的"非正式"字符串表示。
__repr__(self): 返回对象的"正式"字符串表示,供调试使用。
3. 数值运算
__add__(self, other): 实现+运算符。
__sub__(self, other): 实现-运算符。
__mul__(self, other): 实现*运算符。
__truediv__(self, other): 实现/运算符(Python 3中的真实除法)。
__floordiv__(self, other): 实现//运算符(整数除法)。
__mod__(self, other): 实现%运算符(取模)。
__pow__(self, other): 实现**运算符(幂运算)。
4. 序列操作
__len__(self): 返回对象的长度或元素个数。
__getitem__(self, index): 实现item[index]。
__setitem__(self, index, value): 实现item[index] = value。
__delitem__(self, index): 实现del item[index]。
__contains__(self, item): 实现in运算符。
5. 比较运算
__lt__(self, other): 实现<运算符。
__le__(self, other): 实现<=运算符。
__eq__(self, other): 实现==运算符。
__ne__(self, other): 实现!=运算符。
__gt__(self, other): 实现>运算符。
__ge__(self, other): 实现>=运算符。
6. 集合操作
__hash__(self): 返回对象的哈希值(如果对象是可哈希的)。
__iter__(self): 返回一个迭代器对象。
__next__(self): 迭代器对象的next()方法。
__getattribute__(self, name): 访问对象属性时调用。
__setattr__(self, name, value): 设置对象属性时调用。
__delattr__(self, name): 删除对象属性时调用。
7. 上下文管理
__enter__(self): 使用with语句时进入上下文时调用。
__exit__(self, exc_type, exc_val, exc_tb): 使用with语句时退出上下文时调用。
8. 容器操作
__contains__(self, item): 实现in运算符,判断容器中是否包含某个元素。
__iter__(self): 返回一个迭代器对象,用于遍历容器中的元素。
示例:自定义一个可迭代对象
python
class MyRange:  
    def __init__(self, start, end):  
        self.value = start  
        self.end = end  
  
    def __iter__(self):  
        return self  
  
    def __next__(self):  
        if self.value < self.end:  
            current_value = self.value  
            self.value += 1  
            return current_value  
        else:  
            raise StopIteration  
  
# 使用自定义的MyRange类  
for i in MyRange(0, 5):  
    print(i)  # 输出: 0 1 2 3 4

5.3 类的继承

继承是面向对象编程的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以继承父类的特征,也可以通过定义自己的属性和方法来扩展或修改父类的行为。一个类继承另一个类时,它将自动获得另一个类的属性和方法,原有的类称为父类。

新类称为子类,子类不能继承父类的私有属性和方法,但能继承父类其他的属性和方法,同时还可以定义自己的属性和方法,子类定义格式如下:

python 复制代码
class 子类名(父类名)

(1)子类的方法_init_

如果子类重新定义了父类方法后,还需要访问父类的同名方法,如__init__,可以使用super关键字。

(2)给子类定义属性和方法

一个类继承另一个类后,可添加区分子类里父类所需的新属性和方法。

定义子类时,可以根据需要添加任意数量的属性和方法,但要注意子类中只添加子类独有的属性和方法,如果是所有子类都拥有的,应该添加到父类的属性和方法中。

(3)重写父类方法

对于父类中的方法,如果它不符合子类模拟的实物的行为,都可对其进行重写,为此,可在子类中定义与父类同名的方法,这样,python程序在运行时将不会考虑这个父方法,而只考虑同名的子类方法。

(4)将实例用作属性

使用代码模拟实物时,可能会发现需要给类添加的细节越来越多,属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来,将大类拆分成多个协同工作的小类,即将一个类的实例作为另一个类的属性。

5.4 导入类

类的编写也要遵循模块化编程,导入类有多种方式,可以导入单个类,导入多个类,导入整个模块导入模块中的所有类等。

相关推荐
2401_857439691 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna2 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_2 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
梧桐树04293 小时前
python常用内建模块:collections
python
Dream_Snowar3 小时前
速通Python 第三节
开发语言·python
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
高山我梦口香糖4 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
sanguine__4 小时前
Web APIs学习 (操作DOM BOM)
学习
信号处理学渣4 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客4 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++