python入门系列八(类)

1.引言

python是一种面向对象编程语言,类是面向对象编程中组织代码的基本单元。如果你有其它面向对象编程语言的基础,比如java,那么你一定,也应该知道面向对象编程的三大核心:封装,继承,多态。

  • 封装:通过封装,隐藏对象的内部实现细节,仅暴露公共接口给外部使用。实现了信息和操作细节的隐藏。
  • 继承:通过继承实现代码的可复用性和扩展
  • 多态:通过多态实现了代码运行时动态特性,即根据对象的实际类型而非申明类型进行代码调用

而这一切,都要以类作为基础。下面我们来看关于python中类的方方面面!

2.类

2.1.再聊编程范式

之所以说是再聊编程范式,原因在于在之前"面向对象编程 "专栏关于编程范式,有过详尽的分享:面向过程编程,面向对象编程,函数式编程 三大编程范式。感兴趣的朋友可以看看这篇文章:juejin.cn/post/742110...。在这里,我就不重复造轮子了。

2.2.类的基本定义和使用

python中通过class关键字进行类定义的修饰。像这样:

python 复制代码
#定义类
class Person:
    def hello(self):
        print("hello python class!")

# 实例化类,并使用
obj = Person()
obj.hello()

2.3.类的继承

继承可以实现代码的复用性。python中继承使用像这样:

python 复制代码
# 定义类
class Person:
    def hello(self):
        print("hello python class!")

# 定义子类Student,继承Person
class Student(Person):
    def hello(self):
        # 调用父类hello方法,通过super()
        super().hello()
        print("here output Student class")

# 实例化Student并使用
obj = Student()
obj.hello()

2.4.类的装饰器

类的装饰器,在上一篇关于函数的分享文章中,有简单的提及,你可以回过头去看看。今天我要给你分享的是:@classmethod,@staticmethod,@property三个装饰器内容。

2.4.1.@classmethod

修饰定义类相关的方法,而非实例。相当于工厂方法。有两个特点:

  • 第一个参数:cls,表示类本身,可用于访问类属性或创建类实例
  • 子类继承父类时,自动指向子类,保持多态特性

示例:

python 复制代码
# 装饰器@classmethod示例
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
        current_year = 2025
        age = current_year - birth_year
        # 创建类的实例
        return cls(name, age)  

# 调用类方法
p = Person.from_birth_year("小王", 2000)  
print(f"小王的年龄:{p.age}") 

2.4.2.@staticmethod

定义与类相关但无需访问类或实例状态的工具方法 。等价于定义一个普通函数,原本和类不相干,但是位置放到类里面,方便引用和维护管理。借鸡生蛋!其实就是在java编程语音中,定义的一个个工具类有没有

python 复制代码
# 装饰器@staticmethod示例
class MathUtils:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def is_even(num):
        return num % 2 == 0

# 像不像java中各种工具类
print(MathUtils.add(3, 5))   
print(MathUtils.is_even(8)) 

2.4.3.@property

将方法转换为:属性。使得访问方法与访问属性方式一致,不需要括号。实际项目中,通常用于封装属性的验证和计算逻辑。换句话描述,等价于通用bean对象的getter/setter方法,这么说你应该就明白了。看一个示例:

python 复制代码
# @property装饰器示例
class Person:
    def __init__(self, name):
        # 内部使用私有变量存储值
        self._name = name  

    @property
    def name(self):
        print("get name...")
        return self._name

    @name.setter
    def name(self, value):
        print("set name...")
        self._name = value

p = Person("小王")
# 调用 @property 的 getter.你看到了:调用方法不需要括号
print(p.name)  
 # 调用 @name.setter
p.name = "老王"  

2.5.类的特殊方法

2.5.1.init

python中init构造方法,在创建类的实例的时候自动调用,用于完成对象属性的初始化。但是要注意,它不负责创建对象,仅仅负责初始化。真正创建对象的方法是new方法。示例:

python 复制代码
class Person:
    def __init__(self, name, age):
        # 初始化实例属性
        self.name = name  
        self.age = age

# 创建实例时自动调用 __init__
p = Person("小王", 30)
print(p.name)  

2.5.2.call

python的神奇方法:call。它让对象实例可以像方法一样调用,在python中,当你这样使用某个对象实例,比如:obj(),实则调用的即是类中的call方法。示例:

python 复制代码
class Adder:
    def __init__(self, base):
        # 初始化实例属性
        self.base = base  

    def __call__(self, x):
        # 调用实例时执行此方法
        return self.base + x

# 创建实例
adder = Adder(10)  
# 等价于调用 adder.__call__(5)
print(adder(5))   

另外call方法,还可用于实现类装饰器。还记得上篇文章的这个案例吗?

python 复制代码
import time
# 定义Timer类,通过__call__实现装饰器功能
class Timer:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        import time
        start = time.time()
        result = self.func(*args, **kwargs)
        end = time.time()
        print(f"耗时: {end - start:.2f}秒")
        return result

@Timer
def slow_function():
    time.sleep(1)

slow_function() 
相关推荐
AI蜗牛之家2 小时前
Qwen系列之Qwen3解读:最强开源模型的细节拆解
人工智能·python
王上上2 小时前
【论文阅读30】Bi-LSTM(2024)
论文阅读·人工智能·lstm
whyeekkk2 小时前
python打卡第48天
开发语言·python
YunTM2 小时前
贝叶斯优化+LSTM+时序预测=Nature子刊!
人工智能·机器学习
舒一笑3 小时前
智能体革命:企业如何构建自主决策的AI代理?
人工智能
丁先生qaq4 小时前
热成像实例分割电力设备数据集(3类,838张)
人工智能·计算机视觉·目标跟踪·数据集
Eiceblue4 小时前
Python读取PDF:文本、图片与文档属性
数据库·python·pdf
红衣小蛇妖5 小时前
神经网络-Day45
人工智能·深度学习·神经网络
weixin_527550405 小时前
初级程序员入门指南
javascript·python·算法
KKKlucifer5 小时前
当AI遇上防火墙:新一代智能安全解决方案全景解析
人工智能