Python 面向对象编程基础
面向对象编程(OOP)是现代编程语言中的一种重要编程范式,它通过类和对象
来组织代码,提高代码的可重用性
和可维护性
。Python是完全支持面向对象编程的语言,它通过类和对象
来帮助程序员设计更加模块化和可扩展的代码。
可以理解为:你正在设计一个动物园。你不仅仅是列出动物的名字、年龄、体重等信息,还要给它们设定它们的行为,比如吃饭、走路、叫声等等。面向对象编程就像是你把每个动物视为一个独立的实体
,而这个实体
有自己的数据和行为,互相独立但又可以互动
可通过此图增加印象:

为什么要学习面向对象?
学习面向对象编程的原因如下:
- 提高代码重用性:面向对象可以通过继承和多态等机制,避免重复编写相似的代码。通过设计合理的类和方法,程序员可以轻松重用已有的代码,而不必每次都从头开始。
- 增强代码可维护性:面向对象通过将数据和方法封装到类中,减少了程序各部分之间的依赖,方便修改和扩展。即使项目不断增加功能,修改也会更加集中和有条理。
- 更好的代码组织结构:当项目规模增大时,面向对象能够将复杂的系统拆解为更小、更易管理的模块,每个类负责自己的功能,简化了开发过程。
- 更贴近现实世界的建模方式:面向对象编程通过类和对象的概念,可以模拟现实世界中的事物和关系,让开发者可以更加自然地描述问题并解决问题。
面向对象编程中的三个重要概念
1. 类的定义
类是面向对象编程中的核心概念之一,它定义了对象的属性和行为。类是创建对象的模板,通过定义类,我们能够创建具有相同属性和方法的多个对象。
2. 什么是类(Class)?
类就像是"动物"的设计图。在现实世界中,不同的动物都有不同的特征和行为,但它们都符合一个基本的模板(比如都是动物)。这个模板就是类,它定义了动物的特征(属性)和行为(方法)。
- 类就像动物的设计蓝图,比如你设计一份"狗"的蓝图,决定了它有"名字"、"年龄"这些属性,以及"吃饭"、"跑步"等行为。这个蓝图可以用来创建很多不同的狗对象。
3. 什么是对象(Object)?
对象是类的实际体现,是根据类的蓝图创建出来的"具体动物"。每一只狗对象都有自己的名字和年龄,可以吃饭、跑步等。每个对象的属性可以不同,但它们都遵循类定义的规则。 \
- 对象就是按照设计图制造的具体狗,比如你按照"狗"的蓝图制造一只名叫"旺财"的狗,它有自己的名字和年龄。你可以有很多只狗对象,每只狗都是独立的个体,但它们都符合蓝图。
4. 如何创建一个类?
在Python中,类就像我们为动物设计的蓝图。你通过 class
来定义这个蓝图。
- 创建类就像你画出一份狗的设计图,你决定了狗的"属性"(如名字、年龄)和"行为"(如吃饭、跑步)。然后你可以用这个设计图来制造无数只不同的狗。
类名的命名规则
- 类名
首字母大写
,多个单词之间采用驼峰
原则 - 实例名、模块名
采用小写
,多个单词之间采用下划线
隔开
创建类的语法:
python
class 类名:
类属性名1=类属性值1 (可以参考变量)
类属性名2=类属性值2 (可以无限创建属性)
def 类方法(参数): #可以参考函数
#类方法代码
#类方法2 可以定义多个方法
def 类方法(参数): #可以参考函数
#类方法代码
#调用类
类名()
#调用类下面的方法(可以理解为调用类下面的函数)
类名().方法名()
示例代码:
python
class Dog: #创建类为 Dog
legs = 4 # 类属性1
def return_legs(self): # 实例方法
print(f"正常的狗都有{Dog.legs}条腿!")
def return_updata(self): # 实例方法
print(f"我家的旺柴有{Dog.legs}条腿!")
s1=Dog() #创建了一个 `Dog` 类的实例。通过 `s1`,我们可以访问 `Dog` 类的方法和属性
print(s1) #输出的是该对象的内存地址
#调用了 `Dog` 类的实例方法,通过 `self` 访问了类属性 `legs`,并打印了相关信息
s1.return_legs()
s1.return_updata()
输出示例:
csharp
<__main__.Dog object at 0x000001DF510A0160>
正常的狗都有4条腿!
我家的旺柴有4条腿!
解释
-
创建了一个名为
Dog
的类,他的类属性有name和age,还创建了return_legs
和return_updata
方法,都在方法里面调用类属性name并输出,然后实例化Dog类以及调用类方法 -
<__main__.Dog object at 0x000001DF510A0160>
:这是打印s1
对象的默认输出,表示对象的内存地址。它告诉你s1
是一个Dog
类的实例
PS:改类属性 legs
后,所有方法里面的 legs
属性值都会改变
如何理解 self
?
self
其实是方法内部的一个"指针",它指向调用该方法的实例对象。所以每个方法的第一个参数self
都表示当前对象本身- 你可以把它看作是一个占位符,具体名称并不重要,通常使用
self
是约定俗成的做法。
为什么要加 self
?
- 引用当前实例 :
self
代表了当前对象本身。它使得你能够在类的方法内部访问和操作该对象的属性和其他方法。 - 每个实例方法都必须有
self
,这样才能确保每个对象有自己的独立状态。
如果不加 self
会怎么样?
如果你在实例方法中不加 self
,Python 会报错。 这是因为方法定义时,第一个参数必须是 self
,以告诉 Python 这个方法是绑定到对象实例上的
5.创建类的实例属性:
他和类属性有什么区别?
- 类属性:类属性是属于整个类的,所有实例共享该属性。它在类中定义,所有实例对象都能访问。
- 实例属性 :实例属性是通过
__init__
方法创建的,每个实例都有独立的属性值。__init__
方法在实例化对象时自动调用,用来初始化对象的状态
类属性与实例属性的比较
属性类型 | 定义位置 | 共享性 | 初始化方式 | 内存消耗 | 适用场景 |
---|---|---|---|---|---|
类属性 | 类体内定义 | 所有实例共享 | 直接在类体内定义 | 内存节省 | 适用于所有实例共享的数据(如常量、默认配置) |
实例属性 | __init__ 方法中定义 |
每个实例独立拥有 | 在 __init__ 方法中定义 |
增加内存消耗 | 适用于每个实例独特的数据(如对象的状态) |
可以理解比喻为:
属性类型 | 比喻 | 适用场景 |
---|---|---|
类属性 | 狗的的腿和耳朵数量(所有狗狗共享) | 所有实例共享的数据,比如常量、默认设置等。 |
实例属性 | 每个狗狗的名字、年龄(所有狗狗独立) | 每个实例需要独立数据和状态的场景,比如个性化的对象数据。 |
实例属性可以理解为类属性,只是独立还是共享的区别
创建实例属性语法
python
class 类名:
# 类属性 可以理解为创建变量
类属性名1 = 类属性值1
类属性名2 = 类属性值2
# 构造方法(初始化方法)
def __init__(self, 参数1, 参数2):
# 实例属性 可以理解为创建变量
self.实例属性1 = 参数1
self.实例属性2 = 参数2
# 类方法1 可以理解为创建函数 但是这里是在类下面创建,所以叫方法
def 方法名1(self):
# 类方法代码
print(f"方法1执行,{self.实例属性1} 和 {self.实例属性2}")
# 类方法2
def 方法名2(self):
# 类方法代码
print("方法2执行")
# 创建类的实例(对象)
obj = 类名(参数1, 参数2) # 传递必要的参数给构造方法
# 调用类的方法
obj.方法1() # 调用方法1
obj.方法2() # 调用方法2
示例代码:
python
class Dog:
# 类属性:所有狗狗共享的属性
legs = 4 # 正常狗狗的腿数都一样 四条腿
def __init__(self, name, breed):
# 实例属性:每只狗独有的属性
self.name = name # 每只狗的名字
self.breed = breed # 每只狗的品种
# 创建两只不同的狗对象
dog1 = Dog("旺柴", "拉布拉多")
dog2 = Dog("小白", "吉娃娃")
# 访问类属性
print(dog1.legs) # 输出 4
print(dog2.legs) # 输出 4
# 访问实例属性
print(dog1.name) # 输出 旺柴
print(dog2.name) # 输出 小白
# 修改类属性
Dog.legs = 3
print(dog1.legs) # 输出 3
print(dog2.legs) # 输出 3
# 修改实例属性
dog1.name = "大黄"
print(dog1.name) # 输出 大黄
print(dog2.name) # 输出 小白
解释:
- 类属性 (
legs
) :
python
legs = 4 # 正常狗狗的腿数都一样 四条腿
- 所有的狗狗共享同样的腿数,这里假设每只狗的腿数都是
4
。类属性是所有对象共享的,所以修改了类属性后,所有对象都会受到影响。
- 实例属性 (
name
和breed
) :
python
def __init__(self, name, breed):
# 实例属性:每只狗独有的属性
self.name = name # 每只狗的名字
self.breed = breed # 每只狗的品种
- 每只狗狗的名字和品种是独特的,这些是通过
__init__
方法在对象创建时传入并设置的。 _init__
方法在 Python 中被称为构造方法(Constructor),它是一个特殊的方法,用于在创建对象时初始化对象的属性
- 类的实例化(创建狗狗对象):
python
dog1 = Dog("旺柴", "拉布拉多")
dog2 = Dog("小白", "吉娃娃")
dog1
和dog2
是两只不同的狗,分别有不同的名字和品种。
- 访问类属性和实例属性:
python
# 访问类属性
print(dog1.legs) # 输出 4
print(dog2.legs) # 输出 4
#访问实例属性
print(dog1.name) # 输出 旺柴
print(dog2.name) # 输出 小白
dog1.legs
和dog2.legs
输出的是类属性legs
的值,默认是 4。dog1.name
和dog2.name
输出的是每只狗的实例属性name
。
- 修改类属性和实例属性:
python
# 修改实例属性
dog1.name = "大黄"
print(dog1.name) # 输出 大黄
print(dog2.name) # 输出 小白
- 修改类属性
legs
后,所有狗对象的legs
属性都会改变。 - 修改实例属性
dog1.name
后,只有dog1
的名字会改变,dog2
的名字保持不变。
总结
本文以动物园管理 为生动比喻,系统讲解Python面向对象编程(OOP)核心概念,包括类与对象
的定义、类属性
与实例属性
的区别、self
关键字的原理及实际应用场景。通过代码示例与类比教学,帮助初学者快速掌握OOP的封装、继承思想,提升代码复用性与可维护性,为开发复杂项目奠定基础。