Python 面向对象编程基础:类、对象与核心概念详解
Python 面向对象编程基础涵盖了类与对象的定义、属性管理、方法调用及魔法方法的应用。文章通过对比面向过程,阐述了面向对象将事物抽象为类并实例化的思想。内容深入解析了实例变量与类变量的区别、私有属性的封装机制、以及继承与多态的实现方式。此外,还补充了静态方法和类方法的用途,并通过烤地瓜和银行账户等案例展示了实际编码场景。旨在帮助开发者理解 OOP 设计模式,提升代码的可维护性与复用性,掌握 Python 编程的核心范式。

Python 面向对象编程基础涵盖了类与对象的定义、属性管理、方法调用及魔法方法的应用。文章通过对比面向过程,阐述了面向对象将事物抽象为类并实例化的思想。内容深入解析了实例变量与类变量的区别、私有属性的封装机制、以及继承与多态的实现方式。此外,还补充了静态方法和类方法的用途,并通过烤地瓜和银行账户等案例展示了实际编码场景。旨在帮助开发者理解 OOP 设计模式,提升代码的可维护性与复用性,掌握 Python 编程的核心范式。

在开始深入代码之前,我们需要先理解什么是面向对象(Object-Oriented Programming, OOP)。为了便于理解,我们可以将其与面向过程编程进行对比。
场景示例:肚子饿了,想吃饭
总结:面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管它内部的情况。而编程就是设置事物能够做什么事。这种思想提高了代码的复用性、可维护性和扩展性。
思考:打电话需要用手机,这个手机就是一个对象,这个对象哪来的呢? 答:它是制造出来的。 思考:怎么制造的? 答:先构思图纸,再生产。
在面向对象编程过程中,有两个重要组成部分:类和对象。
类是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,不是真实存在的事物。
类好比是制造手机时要用到的图纸,也就是说类是用来创建对象的模板。
对象是类创建出来的真实存在的事物,例如:你手中的那部 iPhone 或华为手机。
注意:开发中,先有类,再有对象。类是蓝图,对象是实体。
class ClassName:
# 代码块
pass
注意:类名要满足标识符命名规则,同时遵循驼峰命名习惯(CamelCase),例如
MyPhone。
快速体验:
class MyProject:
print("我是第一个类")
语法:
# 变量名 = 类名()
快速体验:
class MyPhone:
def call_tel(self):
print("正在打电话")
def play_game(self):
print("正在打游戏")
# 创建对象
apple = MyPhone()
print(apple)
# 调用对象的实例方法
apple.play_game()
创建对象的过程也叫实例化对象。
self 代表类的实例。
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,按照惯例它的名称是 self。
当调用 apple.play_game() 时,Python 解释器会自动将 apple 对象作为第一个参数传递给 play_game 方法,即相当于 MyPhone.play_game(apple)。
属性即是特征,比如:手机的颜色,大小,重量… 对象属性既可以在类外面添加和获取,也能在类里面添加和获取。
语法:
对象名。属性名 = 值
快速体验:
class MyPhone:
def main(self):
pass
apple = MyPhone()
apple.width = 10
apple.height = 15
print(apple.width)
print(apple.height)
语法:
self.属性名
快速体验:
class MyPhone:
def main(self):
print(self.width)
print(self.height)
apple = MyPhone()
apple.width = 10
apple.height = 15
apple.main()
在 Python 中,__xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数。这些方法通常在特定事件发生时自动触发。
问题:手机的尺寸大小生来就有,那么能不能在生产之前就赋予属性呢?
init():初始化对象。当创建对象时,该方法会被自动调用。
class MyPhone:
def __init__(self):
self.width = 10
self.height = 15
def main(self):
print(self.width)
print(self.height)
apple = MyPhone()
init() 方法,在创建一个对象时默认被调用,不需要手动调用。 init(self) 中的 self 参数,不需要开发者传递,python 解释器会自动把当前的对象引用传递过去。
一个类可以创建多个对象,如何对不同的对象设置不同的初始化属性呢?传参即可。
class MyPhone:
def __init__(self, width, height):
self.width = width
self.height = height
def apple_phone(self):
print("苹果手机的宽为:", self.width)
print("苹果手机的高为:", self.height)
def huawei_phone(self):
print("华为手机的宽为:", self.width)
print("华为手机的高为:", self.height)
apple = MyPhone(10, 20)
apple.apple_phone()
当使用 print 输出对象的时候,默认打印对象的内存地址。如果类定义了 str 方法,那么就会打印从在这个方法中 return 的数据。
解释类的属性或作用:
class Demo:
def __init__(self, width, height):
self.width = width
self.height = height
def __str__(self):
return f"你这个手机的宽是{self.width},高度是{self.height}"
a = Demo(10, 20)
print(a)
除了 __init__ 和 __str__,还有其他常用的魔术方法:
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
class Demo:
__num = 0 # 私有属性
result = 0 # 公开属性
def count(self):
self.__num += 1
self.result += 1
print(self.__num)
run = Demo()
run.count()
run.count()
print(run.result)
print(run.__num) # 报错,实例不能访问私有变量
class Counter:
class_count = 0 # 类变量
def __init__(self):
self.instance_count = 0 # 实例变量
def increment(self):
self.instance_count += 1
Counter.class_count += 1
c1 = Counter()
c2 = Counter()
c1.increment()
c2.increment()
print(c1.instance_count) # 1
print(c2.instance_count) # 1
print(Counter.class_count) # 2 (共享)
class MathUtils:
@staticmethod
def add(x, y):
return x + y
@classmethod
def get_name(cls):
return cls.__name__
print(MathUtils.add(1, 2))
print(MathUtils.get_name())
继承允许我们定义一个子类,它继承父类的属性和方法,并可以添加新的功能。
class Animal:
def speak(self):
print("动物发出声音")
class Dog(Animal):
def speak(self):
print("汪汪叫")
dog = Dog()
dog.speak() # 输出:汪汪叫
多态是指不同类的对象可以对同一消息做出响应。通过继承,子类可以重写父类的方法。
def make_sound(animal):
animal.speak()
make_sound(Dog())
需求涉及一个事物:地瓜,故案例涉及一个类:地瓜类。
被烤的时间和对应的地瓜状态:
添加调料:支持多种调料。
class Potato:
def __init__(self):
# 烤的时间
self.cook_time = 0
# 烤的状态
self.cook_status = "生的"
# 放的调料
self.cook_seasoning = []
def cook(self, time):
self.cook_time += time
if 0 <= self.cook_time < 5:
self.cook_status = "生的"
elif 5 <= self.cook_time < 10:
self.cook_status = "半生半熟"
elif 10 <= self.cook_time <= 12:
self.cook_status = "熟了"
else:
self.cook_status = "烤糊了"
def add_seasoning(self, *seasoning):
self.cook_seasoning.extend(seasoning)
def __str__(self):
return f"当前地瓜考了--{self.cook_time}--分钟,他的状态是--{self.cook_status}--,添加的调料是--{self.cook_seasoning}"
if __name__ == :
potato = Potato()
potato.cook()
potato.add_seasoning(, , )
(potato)
为了更好地掌握面向对象,我们构建一个简单的银行账户系统。
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # 私有余额
def deposit(self, amount):
if amount > 0:
self.__balance += amount
print(f"存款成功,当前余额:{self.__balance}")
else:
print("存款金额必须大于 0")
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
print(f"取款成功,当前余额:{self.__balance}")
else:
print("余额不足或金额无效")
def get_balance(self):
return self.__balance
account = BankAccount("张三", 1000)
account.deposit(500)
account.withdraw(200)
print(account.get_balance())
本文详细讲解了 Python 面向对象编程的核心概念,包括类与对象的定义及关系、实例属性与方法的使用、魔法方法的功能与应用。内容涵盖私有属性的封装机制、类的继承与多态特性,并通过烤地瓜和银行账户等案例演示了实际编码技巧。此外还补充了类变量与实例变量的区别、静态方法与类方法的用法,帮助读者系统掌握 Python 面向对象的设计思想与最佳实践。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online