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() 
相关推荐
小白学大数据8 分钟前
利用Selenium和PhantomJS提升网页内容抓取与分析的效率
爬虫·python·selenium·测试工具
无你想你18 分钟前
DataWhale大语言模型-大模型技术基础
人工智能·语言模型·自然语言处理
背太阳的牧羊人18 分钟前
LLaMA-Factory 训练数据默认使用 instruction、input、output 三个 key
人工智能·llama·大模型微调
爱分享的淘金达人20 分钟前
25年教师资格认定材料及认定详细流程‼
java·python·考研·小程序·tomcat
~漠北~23 分钟前
Pycharm实用技巧
ide·python·pycharm
后端小肥肠26 分钟前
基于RAGFlow本地部署DeepSpeek-R1大模型与知识库:从配置到应用的全流程解析
人工智能·ai
struggle202537 分钟前
Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。
人工智能·自然语言处理·数据分析·自动化·copilot·deepseek
Sheakan43 分钟前
【文献阅读】DeepRAG:大语言模型的检索增强推理新范式
人工智能·语言模型·自然语言处理
meisongqing44 分钟前
目前人工智能的发展,判断10年、20年后的人工智能发展的主要方向,或者带动的主要产业
人工智能