上一篇我们对比讲解了面向过程编程和面向对象编程,今天再补充一下面向对象核心概念以及重要的三大特征:封装、继承、多态class Person: """人类""" pass
2.对象/实例:
类的具体实现
person1 = Person() # 创建Person类的实例
3.属性:
对象的特征或数据
class Person: def __init__(self, name): self.name = name # 实例属性 Person.species = "人类" # 类属性
4.方法:
对象的行为或功能
class Person: def say_hello(self): # 实例方法 print(f"你好,我是{self.name}") @classmethod def get_species(cls): # 类方法 return cls.species @staticmethod def is_adult(age): # 静态方法 return age >= 18
封装是面向对象最基本也最重要的特性。它就像给代码穿上防护服——只暴露必要的接口,隐藏内部复杂的实现细节。
想象一下你用的智能手机:你只需要知道按哪里可以打电话、哪里可以拍照,不需要了解里面的芯片是怎么工作的。这就是封装。
class BankAccount: def __init__(self, owner, balance=0): self.owner = owner self.__balance = balance # 私有属性 def deposit(self, amount): """存款""" if amount > 0: self.__balance += amount return True return False def withdraw(self, amount): """取款""" if 0 < amount <= self.__balance: self.__balance -= amount return True return False def get_balance(self): """获取余额(通过方法访问私有属性)""" return self.__balance
# 父类class Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("子类必须实现此方法")# 子类继承class Dog(Animal): def __init__(self, name, breed): super().__init__(name) # 调用父类构造函数 self.breed = breed def speak(self): # 方法重写 return "汪汪!" def fetch(self): # 子类特有方法 return f"{self.name}在接飞盘"# 多级继承class Puppy(Dog): def __init__(self, name, breed, age_months): super().__init__(name, breed) self.age_months = age_months def speak(self): return "呜呜~(小声)"
(1)继承时要先用super().__init__(*args)调用父类的构造函数(2)如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,比如上例中的speak方法比如下面的例子中,我们创建了Shape类、Rectangle类和Circle类,并各自定义了area方法,虽然方法名相同,但实现并不一样。class Shape: def area(self): passclass Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.heightclass Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14159 * self.radius ** 2# 多态演示shapes = [Rectangle(3, 4), Circle(5), Rectangle(2, 6)]for shape in shapes: print(f"面积: {shape.area()}")# 输出:# 面积: 12# 面积: 78.53975# 面积: 12
1.单一职责原则:一个类只做一件事
2.开闭原则:对扩展开放,对修改关闭
3.里氏替换原则:子类可以替换父类
4.接口隔离原则:接口要小而专一
5.依赖倒置原则:依赖抽象,不依赖具体
面向对象编程不仅仅是语法,更是一种思维方式。它教会我们如何:
分解复杂问题:将大系统拆分成小对象
管理代码复杂度:通过封装隐藏细节
提高代码复用:通过继承和组合
增强系统灵活性:通过多态和抽象
刚开始可能会觉得面向对象有些“过度设计”,但随着项目规模的增长,你会发现它的价值——让代码既有弹性又有纪律,既能快速响应变化又能保持稳定。
以下代码实现了一个图形计算系统,选择正确的输出结果:
from abc import ABC, abstractmethodimport mathclass Shape(ABC): @abstractmethod def area(self): pass @abstractmethod def perimeter(self): pass def description(self): return f"这是一个{self.__class__.__name__}"class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return math.pi * self.radius ** 2 def perimeter(self): return 2 * math.pi * self.radius def diameter(self): return 2 * self.radiusclass Square(Shape): def __init__(self, side): self.side = side def area(self): return self.side ** 2 def perimeter(self): return 4 * self.sideclass Rectangle(Square): def __init__(self, length, width): super().__init__(length) # 注意这里! self.width = width def area(self): return self.side * self.width def perimeter(self): return 2 * (self.side + self.width)# 测试代码shapes = [ Circle(5), Square(4), Rectangle(3, 6)]results = []for shape in shapes: if isinstance(shape, Circle): results.append(f"直径: {shape.diameter():.1f}") results.append(f"面积: {shape.area():.1f}") results.append(f"周长: {shape.perimeter():.1f}")# 问题:results 列表中的第三个元素是什么?
A. "面积: 78.5"B. "面积: 28.3"C. "面积: 18.0"D. "面积: 12.0"判断以下说法是否正确:
面向对象编程的核心思想是将程序看作一系列步骤的集合。 (×)
2.类是对现实世界实体的抽象,对象是类的具体实例。 (√)
3.面向对象编程相比面向过程编程,执行效率总是更高。 (×)
如果想一起学习数据分析相关知识,一起交流的朋友,欢迎加我微信,备注【数之真理】,9.9元解锁每日数据小知识分享,全网新手最友好!干货最充足!氛围最好的数据分析分享群等你加入!更多高能福利持续解锁中,福利多多,千万不要错过!!1对1数据咨询开放中,欢迎加V预约咨询,首次咨询享超值优惠