hello,大家好呀!我是星禾。
刚接触编程的朋友可能都会面临这样的问题,学习面向对象编程(OOP)之前,写代码都是"函数式思维"——遇到问题就写个函数,导致同一个项目的代码越写越乱,改起来特别头疼。
学习了OOP之后就会发现,类这个概念真的太香了!它能把数据和操作数据的方法打包在一起,代码结构一下子就会清晰很多。
今天我就把我整理的OOP入门知识分享给大家,尤其适合刚学完基础、想进阶的Python小白。
▶什么是类?先搞懂这个基本概念
简单来说,类(Class) 就是一种"蓝图"或者"模板",它定义了某种事物的共同特征和行为。
举个例子,"狗"这个类会包含: - 属性:名字、年龄、品种(数据) - 方法:叫、跑、吃饭(行为)
而具体的某只狗,比如"旺财",就是从这个蓝图"刻"出来的对象。
class Dog: species = "犬科" # 类属性:所有狗共享 def __init__(self, name, age): self.name = name # 实例属性:每只狗不同 self.age = age def bark(self): # 实例方法 return f"{self.name}汪汪叫!"
▶核心问题:实例方法、类方法、静态方法到底怎么选?
这是很多初学者困惑的地方。结合我总结的这张对比表,相信你会有更清晰的概念。一下子就会拜托那种傻傻分不清的状态:
| | | | | |
|---|
| | self | | | 最常用! |
| @classmethod | cls | | | |
| @staticmethod | | | | |
1️⃣ 实例方法 —— 最常用的那种
实例方法是我们在类里写得最多的方法。它的第一个参数必须是 self,代表调用这个方法的具体对象。
class BankAccount: def __init__(self, balance): self.balance = balance # 实例属性 def withdraw(self, amount): # 实例方法 if amount <= self.balance: self.balance -= amount return f"取款成功,剩余{self.balance}" return "余额不足"# 创建对象account = BankAccount(1000)print(account.withdraw(300)) # 取款成功,剩余700
什么时候用:当你的方法需要访问或修改某个具体对象的状态时,用实例方法。
2️⃣ 类方法 —— 操作"类"而不是"对象"
类方法用 @classmethod 装饰,第一个参数是 cls(代表类本身)。
它最大的特点是:不需要创建对象就能调用,而且能访问类属性。
class Person: population = 0 # 类属性:所有Person共享 def __init__(self, name): self.name = name Person.population += 1 @classmethod def get_population(cls): return cls.population @classmethod def from_string(cls, person_str): # 工厂方法:从字符串创建对象 name = person_str.split("-")[0] return cls(name)print(Person.get_population()) # 0,还没创建对象p1 = Person("小明")p2 = Person.from_string("小红-25") # 用类方法创建对象print(Person.get_population()) # 2
什么时候用: - 需要统计类级别数据(比如总共有多少个对象) - 提供多种创建对象的方式(工厂模式) - 不需要访问实例属性
3️⃣ 静态方法 —— 挂在类里的"工具人"
静态方法用 @staticmethod 装饰,不需要 self 或 cls 参数,它就像一个普通的函数,只是"住在"类里面。
import mathclass MathUtils: @staticmethod def calculate_distance(x1, y1, x2, y2): return math.sqrt((x2-x1)**2 + (y2-y1)**2) @staticmethod def is_valid_email(email): return "@" in email and "." in email# 调用:不需要创建对象dist = MathUtils.calculate_distance(0, 0, 3, 4)print(dist) # 5.0print(MathUtils.is_valid_email("test@example.com")) # True
什么时候用:这个函数的逻辑与类相关,但完全不需要访问类或实例的任何数据。
▶用生活中的例子理解OOP三大特征
光讲代码可能有点抽象,来说几个生活场景帮助理解:
封装 —— "柜子锁门"的思想
就像手机有指纹锁,你只能通过指纹解锁来操作,不能直接拆电池。类的封装就是给数据"上锁",保护内部状态不被随意破坏。
class BankAccount: def __init__(self): self.__balance = 0 # 私有属性,外部访问不了 def deposit(self, amount): if amount > 0: self.__balance += amount return True return False def get_balance(self): return self.__balanceaccount = BankAccount()account.deposit(1000)print(account.get_balance()) # 1000# print(account.__balance) # 报错!访问不了
继承 —— "儿子继承老子"
儿子可以继承父亲的姓氏、房产,同时也可以有自己的特点。类的继承就是让子类自动拥有父类的属性和方法。
class Animal: def speak(self): print("动物叫")class Dog(Animal): # Dog继承Animal def speak(self): # 重写父类方法 print("汪汪!")class Cat(Animal): def speak(self): print("喵喵!")dog = Dog()dog.speak() # 汪汪!
多态 —— "同一个动作,不同表现"
不同的人对"打招呼"有不同的方式。Python的多态让你用统一的接口调用不同的实现。
def make_speak(animal): animal.speak()make_speak(Dog()) # 输出: 汪汪!make_speak(Cat()) # 输出: 喵喵!# 同一个函数,传入不同对象,表现不同
▶实战:写一个简单的电商订单类
最后来一个实际场景练练手:
class Product: def __init__(self, name, price): self.name = name self.price = price def get_price(self): return self.priceclass DiscountedProduct(Product): def __init__(self, name, price, discount): super().__init__(name, price) self.discount = discount def get_price(self): # 多态:重写价格计算 return self.price * (1 - self.discount)# 统一管理订单products = [ Product("手机", 3000), DiscountedProduct("耳机", 500, 0.2) # 8折]total = sum(p.get_price() for p in products)print(f"订单总价:¥{total}") # 3400
看,即使产品打折逻辑不同,我们只需要调用 get_price(),不用管具体实现。这就是多态的好处。
▶总结
学完这一章,相信你也感受到了:OOP不是高深莫测的概念,而是组织代码的一种思维方式。
记住这张表就够了:
下节课我们继续深入,看看怎么用OOP思想写一个完整的小项目!
今日份总结:
- ✅ 理解了类与对象的区别
- ✅ 掌握了三种方法的适用场景
- ✅ 了解了封装、继承、多态的概念
- ✅ 通过实战巩固了知识
今天的分享就到这里啦,大家平时写Python更习惯用函数式还是面向对象呢?
欢迎在评论区打出来,我们一起交流~
我是星禾,专注AI前沿知识分享,如果你想入局AI赛道,赶上这波风口。欢迎来找我, 我这里有基础的免费资料,也有全套的系统化AI智能体+工作流搭建+AI漫剧+小龙虾课程。欢迎各位朋友的加入!