Python面向对象编程 Class详解

 更新时间:2026年04月06日 08:32:13   作者:shacofun  
本文介绍了面向过程编程和面向对象编程的概念,包括类、对象、封装、继承、多态、抽象等基础知识,并通过实例讲解了如何创建类、修改属性值、实现类的继承、特殊方法以及访问控制等高级特性,感兴趣的朋友跟随小编一起看看吧

一、概念

1️⃣ 面向过程编程(Procedural Programming)/prəˈsiːdʒərəl/
以“步骤”为核心,比如C语言,一步一步执行
2️⃣ 面向对象编程(OOP)
以“对象”为核心,比如Java、C++、Python,把现实世界抽象成“类”和“对象”

  • 类 (Class): 类就是制造对象的一个模板或蓝图。它定义了一类事物共有的属性(数据)和行为(方法)。
  • 对象 (Object): 根据类创建出来的具体实例。
  • 属性(Attributes)/əˈtrɪbjuːts/:属性就是对象的特点或信息
  • 方法(Methods)/ˈmeθədz/:法就是对象能做的动作或功能。

四大特性

  • 封装 (Encapsulation)/ɪnˌkæpsjuˈleɪʃ(ə)n/:封装是将数据和操作数据的方法绑定在一起,并对外隐藏内部细节。通过控制访问权限(如 private, public),我们只暴露必要的接口
  • 继承 (Inheritance)/ɪnˈherɪtəns/:继承允许一个类(子类)获取另一个类(父类)的属性和方法。子类可以在保留父类功能的基础上,增加新的功能或修改既有功能。
  • 多态 (Polymorphism)/ˌpɑːlɪˈmɔːrˌfɪzəm/:多态是指“同一种行为,在不同的对象上有不同的表现形式”。比如“动物”类有一个“叫”的方法。当它是“狗”对象时,输出“汪汪”;当它是“猫”对象时,输出“喵喵”。
  • 抽象 (Abstraction)/æbˈstrækʃn/: 抽象是简化现实世界复杂性的过程。只关注与当前目标相关的特性,而忽略无关的细节。比如在开发“挂号系统”时,我们只需要“病人”的姓名、病历号,而不需要知道他的身高或喜欢的颜色。

二、实操

2.1 创建第一个类

#定义类
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_info(self):
        return f"{self.year} {self.make} {self.model}"
        
    def start_engine(self):
        info = self.get_info() # 类的方法内部也可以互相调用
        print(f"{info} 启动了!")
#创建对象        
car1 = Car("Toyota", "Camry", 2020)
#调用方法
print(car1.get_info())
car1.start_engine()

----输出:
2020 Toyota Camry
2020 Toyota Camry 启动了!

解析
class (类),是用来定义一个类的关键字,在这里,我们定义了一个名为 Car的类。【类】
__init__ (构造函数),核心就是为了初始化,不写此函数需要手动赋值
get_info() :类中的方法**【方法】**
car1:使用Car类创建出car1对象**【对象】**
car1.get_info():对象调用类里get_info方法
self: 当前这个对象自己
make, model, year: 传入的参数 【属性】
make, model, year 在 __init__ 的括号里是形参(占位符);而你在 Car(“Toyota”, “Camry”, 2020) 里传入的是实参(具体的值)

如果出现中文乱码:在代码开始位置加入

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

2.2 修改属性值

  • 动态修改属性 :
    可以在创建对象之后,通过直接访问属性来修改它们的值。
#修改属性的值
car1.year = 2021
print(car1.get_info())
  • 动态添加新属性:
    可以添加类定义里根本没有的属性。
car1.color = "Red" # 可以动态添加属性
print(f"{car1.get_info()} 的颜色是 {car1.color}")
  • 使用内置函数修改:
    setattr(obj, name, val) 设置属性值
    getattr(obj, name) 获取属性值
    delattr(obj, name) 删除属性
    hasattr(obj, name) 检查是否有某属性
  • 带有参数的方法:
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_info(self,start):# start 是临时传入的变量
        return f"{self.year} {self.make} {self.model}{start}"
    
          
car1 = Car("Toyota", "Camry", 2020)

print(car1.get_info("启动了")) #输出2020 Toyota Camry启动了

2.3 类的继承

子承父业

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        
    def get_info(self):
        return f"{self.year} {self.make} {self.model}"    

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_size):
        #super()函数调用父类的构造方法,初始化父类的属性
        super().__init__(make, model, year)
        #子类特有的属性
        self.battery_size = battery_size

#子类特有的方法
    def get_battery_info(self):
        return f"Battery size: {self.battery_size} kWh"
         
car1 = Car("Toyota", "Camry", 2020)
car2 = ElectricCar("Toyota", "Camry", 2020, 100)
print(car1.get_info())#输出:2020 Toyota Camry
print(car2.get_battery_info())#输出:Battery size: 100 kWh
print(car2.get_info() + " " + car2.get_battery_info())#输出:2020 Toyota Camry Battery size: 100 kWh

super() :它是子类向父类“借东西”的工具。super().init(…) 的意思是:先把父类里定义好的初始化逻辑跑一遍
如果子类想修改父类方法,直接重写即可

 def get_info(self):
        # 调用父类的方法获取基础信息,再加上电车特有的信息
        basic_info = super().get_info()
        return f"{basic_info} (纯电动模式)"
print(car2.get_info()) #输出2020 Toyota Camry (纯电动模式)

2.4 类的特殊方法

名称前后都有双下划线
A. 生命周期类(对象的创建与销毁)
__init__(self, …)`: 初始化方法。在创建对象时自动调用,用于设置初始属性。

__new__(self, ...): 创建实例的方法。在 __init__ 之前执行,通常在自定义元类或单例模式时才用到。

__del__(self): 析构方法。当对象被销毁(垃圾回收)时触发。
B. 字符串表示类(让对象“好看”)
这是开发中最常用的,用来定义当你 print 一个对象时显示什么。
__str__print(obj)str(obj)给用户看的,返回友好的描述
__repr__ : 直接输入对象名或 repr(obj)给开发者看的,返回准确的调试信息

class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

    def __str__(self):
        return f"这是一辆 {self.make} {self.model}"

car = Car("Toyota", "Camry")
print(car)  # 输出: 这是一辆 Toyota Camry
#平时调用是直接

C. 算术运算符类(让对象能加减乘除)
如果你想让两个对象相加(比如 car1 + car2),你需要定义这些方法:
__add__(self, other): 对应 +
__sub__(self, other): 对应 -
__mul__(self, other): 对应 *
__eq__(self, other): 对应 ==
D. 长度与容器类(让对象像列表一样工作)
__len__(self): 对应 len(obj)。
__getitem__(self, key): 对应 obj[key],让对象可以像字典或列表一样取值。
__contains__(self, item): 对应 item in obj。

2.5 类的访问控制

在 Python 中,类的访问控制主要依靠命名约定和名称修饰,来提示开发者哪些属性和方法不应该被外部代码直接访问或修改。

访问类型格式外部访问
Publicname
Protected_name⚠️
Private__name
class Example:
    def __init__(self):
        self._protected_var = "这是一个受保护的属性"
    def _protected_method(self):
        return "这是一个受保护的方法"

obj=Example()
print(obj._protected_var)  # 输出: 这是一个受保护的属性
print(obj._protected_method())  # 输出: 这是一个受保护的方法
class Example:
    def __init__(self):
        self.__private_var = "这是一个私有的属性"
    def __private_method(self):
        return "这是一个私有方法"

obj=Example()      
# print(obj.__private_var)  # 输出: 报错  
# print(obj.__private_method())  # 输出: 报错     
print(obj._Example__private_var)  # 输出: 这是一个私有的属性
print(obj._Example__private_method())  # 输出: 这是一个私有方法

Getter (访问器) 和 Setter (修改器):

class User:
    def __init__(self, age):
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, value):
        self.__age = value

u = User(20)
u.set_age(21)   
print(u.get_age())

Pythonic 风格(使用 @property装饰器)
在不修改原函数代码的前提下,给函数添加额外的功能。
在代码中,装饰器以 @装饰器名 的形式放在函数定义的上方.

class User:
    def __init__(self,age):
        self.__age=age
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,value):
        if value < 0:
            print("年龄不能为负数")
        else:
            self.__age = value

user = User(25)
print(user.age)  # 输出: 25
user.age = -5  # 输出: 年龄不能为负数
print(user.age)  # 输出: 25 (年龄没有改变)

相关学习代码下载见附件

到此这篇关于Python面向对象编程 Class详解的文章就介绍到这了,更多相关Python面向对象编程 Class内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python使用markconv实现将Markdown转换为PDF

    Python使用markconv实现将Markdown转换为PDF

    PDF是一种跨平台的文档格式,将 Markdown 转换为 PDF 是 markconv 的另一个核心功能,下面我们就来看看Python如何使用markconv实现将Markdown转换为PDF吧
    2026-03-03
  • Django中如何使用sass的方法步骤

    Django中如何使用sass的方法步骤

    这篇文章主要介绍了Django中如何使用sass的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 如何用 Python 子进程关闭 Excel 自动化中的弹窗

    如何用 Python 子进程关闭 Excel 自动化中的弹窗

    这篇文章主要介绍了如何用 Python 子进程关闭 Excel 自动化中的弹窗,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-05-05
  • Python获取多进程执行的返回值实现

    Python获取多进程执行的返回值实现

    本文主要介绍了Python获取多进程执行的返回值实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • python中f字符串以及其常见用法总结

    python中f字符串以及其常见用法总结

    python中的f是format函数的缩写,用于格式化输出,下面这篇文章主要给大家介绍了关于python中f字符串以及其常见用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 利用Python的pandas数据处理包将宽表变成窄表

    利用Python的pandas数据处理包将宽表变成窄表

    这篇文章主要介绍了利用Python的pandas数据处理包将宽表变成窄表,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 简单了解Django应用app及分布式路由

    简单了解Django应用app及分布式路由

    这篇文章主要介绍了简单了解Django应用app及分布式路由,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python实现win桌面通知、出现弹窗(三种方式)

    python实现win桌面通知、出现弹窗(三种方式)

    本文主要介绍了python实现win桌面通知、出现弹窗(三种方式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • python pandas创建多层索引MultiIndex的6种方式

    python pandas创建多层索引MultiIndex的6种方式

    这篇文章主要为大家介绍了python pandas创建多层索引MultiIndex的6种方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • python 列表递归求和、计数、求最大元素的实例

    python 列表递归求和、计数、求最大元素的实例

    今天小编就为大家分享一篇python 列表递归求和、计数、求最大元素的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11

最新评论