Python面向对象编程全面指南:从基础到进阶,一篇文章搞定所有核心概念!

1. 面向对象与面向过程对比
核心区别
表格复制维度面向过程 (POP)面向对象 (OOP)编程思想以"过程"为中心,关注如何执行以"对象"为中心,关注数据与行为的封装核心单元函数/过程类与对象数据处理数据与函数分离,通过参数传递数据与方法封装在对象内部,通过接口访问代码复用通过函数调用实现通过继承、多态等机制实现适用场景简单任务、线性流程、性能敏感场景复杂系统、需求变化频繁、需要高度模块化的项目典型代表C语言、结构化编程Java、Python、C++等现代编程语言
代码示例对比
面向过程实现python# 计算圆的面积和周长

面向对象实现pythonclass Circle:
   

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    def calculate_area(self):
        return 3.14159 * self.radius ** 2
    
    def calculate_perimeter(self):
        return 2 * 3.14159 * self.radius

circle = Circle(5)
area = circle.calculate_area()
perimeter = circle.calculate_perimeter()
 


2. 类与实例
核心概念

类 (Class) : 是创建对象的蓝图或模板,定义了对象的属性和方法
实例 (Instance) : 是类的具体实现,是类的具体化产物
对象 (Object) : 实例的同义词,在Python中一切皆对象
代码示例python# 定义类

class Person:
    species = "Homo sapiens"  # 类属性

    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

    def introduce(self):  # 实例方法
        return f"我叫{self.name},今年{self.age}岁"

# 创建实例
person1 = Person("张三", 25)
person2 = Person("李四", 30)

# 访问属性和方法
print(person1.name)  # 输出: 张三
print(person2.introduce())  # 输出: 我叫李四,今年30岁
print(Person.species)  # 输出: Homo sapiens
 


3. 魔法函数汇总
Python中的魔法函数(Magic Methods)是双下划线包裹的特殊方法,用于实现类的特殊行为。
分类汇总

class L:
    ### 构造与析构
    def __init__(self, value=None):
        self.value = value
        self.container = []
    
    def __del__(self):
        print("对象被销毁")

    ### 字符串表示
    def __str__(self):
        return f"(value={self.value})"

    ### 算术运算
    def __add__(self, other):
        return self.value + other
    
    def __sub__(self, other):
        return self.value - other
    
    def __mul__(self, other):
        return self.value * other
    
    def __truediv__(self, other):
        return self.value / other
    
    def __mod__(self, other):
        return self.value % other

    ### 比较运算
    def __eq__(self, other):
        return self.value == other
    
    def __ne__(self, other):
        return self.value != other
    
    def __lt__(self, other):
        return self.value < other
    
    def __le__(self, other):
        return self.value <= other
    
    def __gt__(self, other):
        return self.value > other
    
    def __ge__(self, other):
        return self.value >= other

    def __len__(self):
        return len(self.container)
    
    def __getitem__(self, key):
        return self.container[key]
    
    def __setitem__(self, key, value):
        self.container[key] = value
    
    def __delitem__(self, key):
        del self.container[key]
    
    def __iter__(self):
        return iter(self.container)
    
    def __next__(self):
        return next(self.container)

    ### 上下文管理
    def __enter__(self):
        print("进入上下文")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出上下文")

    ### 属性访问
    def __getattr__(self, name):
        return f"属性 {name} 不存在"
    
    def __getattribute__(self, name):
        return object.__getattribute__(self, name)
    
    def __setattr__(self, name, value):
        object.__setattr__(self, name, value)
    
    def __delattr__(self, name):
        object.__delattr__(self, name)
 

实例演示:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3)  # 输出: Vector(4, 6)
 


4. 封装
核心概念
封装是面向对象编程的三大特性之一,指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
5. 继承
核心概念
继承是面向对象编程的三大特性之一,允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法,从而实现代码复用。
类型

单继承:一个子类只能继承一个父类
多继承:一个子类可以继承多个父类(Python支持)

class Parent:
    def method(self):
        print("Parent method")

class Child(Parent):
    pass
 


代码示例python# 父类

class Animal:
    def __init__(self, name):
        self.name = name
    
    def eat(self):
        print(f"{self.name} 正在吃东西")

class Dog(Animal):
    def bark(self):
        print(f"{self.name} 正在汪汪叫")

class Cat(Animal):
    def meow(self):
        print(f"{self.name} 正在喵喵叫")

# 创建Dog实例并调用方法
dog = Dog("旺财")
dog.eat()  # 调用继承自Animal的方法
dog.bark() # 调用Dog特有方法

# 创建Cat实例并调用方法
cat = Cat("咪咪")
cat.eat()  # 调用继承自Animal的方法
cat.meow() # 调用Cat特有方法
 


6. 多态
核心概念
多态是面向对象编程的三大特性之一,指的是同一个方法调用可以根据对象的不同而表现出不同的行为。
实现方式

编译时多态:方法重载(Python不支持)
运行时多态:方法重写(Python支持)代码示例pythonclass Animal:

class Animal:
    def __init__(self, name):
        self.name = name
    
    def eat(self):
        print(f"{self.name} 正在吃东西")

class Dog(Animal):
    def bark(self):
        print(f"{self.name} 正在汪汪叫")

class Cat(Animal):
    def meow(self):
        print(f"{self.name} 正在喵喵叫")

# 创建Dog实例并调用方法
dog = Dog("旺财")
dog.eat()  # 调用继承自Animal的方法
dog.bark() # 调用Dog特有方法

# 创建Cat实例并调用方法
cat = Cat("咪咪")
cat.eat()  # 调用继承自Animal的方法
cat.meow() # 调用Cat特有方法
 


7. 多继承
核心概念

一个类可以有一父类(Java,c++)

        也可以有多个类

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def walk(self):
        print("run")

    def __str__(self):
        return f"{self.name}{self.age}"

class Flyer:
    def __init__(self, speed):
        self.speed = speed

    def fly(self):
        print("fly")

    def __str__(self):
        return f"{self.speed}"

class Superman(Person, Flyer):
    def __init__(self, name, age, speed):
        Person.__init__(self, name, age)
        Flyer.__init__(self, speed)

    def __str__(self):
        return f"{self.name}{self.age}{self.speed}"

sp = Superman("超人", 25, 120)
print(sp)
 


8. 抽象类
核心概念
抽象类是一种不能被实例化的类,要求子类必须实现特定的方法。
 

代码示例python

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14159 * self.radius ** 2
    
    def perimeter(self):
        return 2 * 3.14159 * self.radius
 

实例化与输出

circle = Circle(5)
print(circle.area())      # 输出: 78.53975
print(circle.perimeter()) # 输出: 31.4159
 


9. 枚举类
核心概念
枚举类(Enum)是一种特殊的类,用于定义一组具名的常量,提高代码可读性和可维护性。
代码示例

from enum import Enum

class GameState(Enum):
    READY = "准备阶段"
    PLAYING = "游戏中"
    ENDED = "游戏结束"

current_state = GameState.READY

while True:
    print(f"\n当前状态: {current_state.value}")
    print("1. 开始游戏  2. 结束游戏  3. 重新开始")
    
    try:
        choice = int(input("请选择操作: "))
        
        if choice == 1 and current_state == GameState.READY:
            current_state = GameState.PLAYING
            print("→ 游戏开始!")
            
        elif choice == 2 and current_state == GameState.PLAYING:
            current_state = GameState.ENDED
            print("→ 游戏已结束")
            
        elif choice == 3 and current_state == GameState.ENDED:
            current_state = GameState.READY
            print("→ 重置游戏状态")
            
        else:
            print("× 无效操作或状态不匹配")
            
    except ValueError:
        print("× 请输入有效数字")
 


10. 数据的访问级别

class Person:
    def __init__(self, name, age, sex):
        self.name = name      # 公有变量
        self.__age = age      # 私有变量(双下划线开头)
        self._sex = sex       # 受保护变量(单下划线开头)
    
    def __str__(self):
        return self._sex

class SuperPerson(Person):
    def __str__(self):
        return self._sex

# 测试代码
sp = SuperPerson("li", 22, "nv")
print(sp)  # 输出: nv
 


11. 4个Attr函数
Python提供了4个内置函数用于属性访问:

**getattr(obj, name[, default]) **: 获取对象属性
**setattr(obj, name, value) **: 设置对象属性
**hasattr(obj, name) **: 检查对象是否有该属性
**delattr(obj, name) **: 删除对象属性

代码示例python

class Person:
    max_v = 100

    def __init__(self,name):
        self.name=name
    def __str__(self):
        return self.name

    def get_name(self):
        print(self.name)
    @classmethod
    def get_info(cls):
        print("lalal")

    @staticmethod
    def super_p(a,b):
        return a if a > b else b

p = Person("li")
print(hasattr(p,"name"),hasattr(Person,"name"))
print(hasattr(p,"get_name"),hasattr(Person,"get_name"))
print(hasattr(p,"get_info"),hasattr(Person,"get_info"))
print(hasattr(p,"max_v"),hasattr(Person,"max_v"))


setattr(Person,"sex","男")
print(hasattr(Person,"sex"))
delattr(Person,"max_v")
print(hasattr(Person,"max_v"))

setattr(Person,"c",lambda x:x**2)
print(hasattr(Person, "c"))
r = getattr(Person,"c")
r(2)
 


12. 类成员

代码示例python

实例属性是每个实例独有的数据,通过self.属性名定义或访问。类属性直接定义在类内部,所有实例共享,通过类名.属性名访问或修改。实例可以读取类属性,但修改时会创建同名实例属性而非修改类属性本身。

实例方法属于实例,第一个参数为self,用于操作实例数据。类方法属于类,需用@classmethod装饰器,第一个参数为cls,常用于获取类级信息(如类名、父类)。实例可调用类方法,但cls始终指向类本身。

静态方法通过@staticmethod装饰器定义,属于类但无强制参数(如selfcls),常用于工具函数封装。实例和类均可调用。

class Person:
    """
    alallala
    """
    max_v = 1000

    def __init__(self,name):
        self.name = name

    def get_name(self):
        print(self.name)

    def __str__(self):
        return self.name

    @classmethod
    def get_class_info(cls):
        return {
            "name":Person.__name__,
            "doc":Person.__doc__,
            "base":Person.__bases__

        }
    @staticmethod
    def say_hi():
        print("lallalalallalla")

p = Person("lll")
# print(p.get_name())
print(p.__doc__)
print(p.max_v)
p.max_v = 1200
print(p.max_v,Person.max_v)

print(Person.get_class_info())
print(p.get_class_info())
Person.say_hi()
p.say_hi()


13. 动态添加类成员

类属性:直接添加
类方法直接添加,添加的方法需要有装饰器和cls参数
静态方法:直接添加添加的方法需要有装饰器,对参数没要求

import types

class Person:
    def __init__(self,name):
        self.name=name

    def __str__(self):
        return f"{self.name}{self.age}"

    def get_name(self):
        return  self.name

#
p = Person("li")
p2 = Person("ll")

print(p.name,p.get_name())
print(p2.name,p2.get_name())

p.get_age = types.MethodType(lambda self:self.age,p)


Person.Max_v = 100
print(Person.Max_v,p.Max_v,p2.Max_v)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值