编程小白的自学笔记六(python中类的静态方法和动态方法)

简介: 编程小白的自学笔记六(python中类的静态方法和动态方法)

前言

今天我们继续昨天的学习,学习python类的方法。Python中的类有两种方法:静态方法和动态方法,它们在使用时有一些不同的特点。下面我们来详细讲解下:


一、静态方法

静态方法是在方法名上加一行“@staticmenthod”修饰符来指定该方法为静态方法,这个英文单词的意思是不是静态?在静态方法中,不需要使用self关键字来访问实例变量。


静态方法是一种在类中定义的方法,与实例无关,静态方法和昨天学的类方法一致,可以通过“实例名.方法名”和“类名.方法名”两种方式访问。但静态方法没有必需的参数,不能直接获取调用实例和类。静态方法通常用于实现和类相关的功能,但不需要访问实例变量或实例方法。这句话怎么理解呢?我首先编写了下面的代码:  

class Dog:
    def __init__(self,n):
        self.name = n
    def getname1(self):
        print(f'小狗的大名是{self.name}')
    @staticmethod
    def getname2(self):
        print(f'小狗的小名是{self.name}')
dog = Dog('小白')
dog.getname1()
dog.getname2()


结局无疑是报错的,报错代码是getname2() missing 1 required positional argument: 'self',意思就是不需要self这个参数,于是我去掉这个参数,运行后的结果是:


小狗的大名是小白

小狗的小名是


可以正常运行,但是没有参数,于是我将代码修改如下:

class Dog:
    def __init__(self,n):
        self.name = n
    def getname1(self):
        print(f'小狗的大名是{self.name}')
    @staticmethod
    def getname2(m):
        print(f'小狗的小名是{m}')
dog = Dog('小白')
dog.getname1()
dog.getname2('狗子')


可以正常运行,输出结果是


小狗的大名是小白

小狗的小名是狗子

由此得出结论:

1、静态方法可以不带参数。

通过实验发现,不设置参数,可以通过实例调用,正常输出内容。

2、 静态方法无法获取实例

在例子中无论在定义方法的时候传不传self实例进去,self.name都无法调用。

3、静态方法可以传其他参数

我的理解就是静态方法就像是写在类里面的一个普通方法,和这个类关系不大,他就只是写在类里面而已,和一个普通函数没差别。



注意:静态方法不会自动传递任何参数,因此我们必须在调用时显式传递它们。

二、动态方法

动态方法顾名思义就是动态创建,是指在运行时动态地向类或实例添加方法,不是在创建类的时候就创建好的,不是静态地定义好所有方法,也就是说可以将一个已有的方法传给类,动态方法是类中定义的常规方法,与实例相关,可以通过实例来调用。动态方法通常用于实现类中操作实例的功能。按照这个思路我写出如下代码:

class Dog:
    def __init__(self,n):
        self.name = n
def run(m):
    print(f'{m}快跑')
Dog.run = run
dog = Dog('小白')
dog.run()


运行没有报错,但是不是我想要的代码结果。输出结果是:


<__main__.Dog object at 0x000001FA3EA28100>快跑


不难发现,这时的m是一个实例。回想以前的代码,类里面的方法传参都是实例,也就是说普通的方法或者函数是不能直接赋值给类的,或者说得到的结果不是你想要的,于是我将方法改为:

def run(m):

print(f'{m.name}快跑')

这次结果就是正确的:小白快跑。


总的来说,Python提供了多种方式来实现类的动态方法,这使得Python具有很高的灵活性和可扩展性,可以根据需求来选择最合适的方式。

总结

静态方法和动态方法在Python中都是类中定义的方法,用于实现类的功能。静态方法与实例无关,可以直接使用类名调用;动态方法与实例相关,需要通过实例调用。静态方法不会自动传递任何参数,需要在调用时显式传递;动态方法自动将实例作为第一个参数传递给该方法。

相关文章
|
1天前
|
数据挖掘 开发者 Python
如何自学Python编程?
【7月更文挑战第14天】如何自学Python编程?
16 4
|
4天前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
【7月更文挑战第11天】在Python编程中,图以邻接表或邻接矩阵表示,前者节省空间,后者利于查询连接。通过字典实现邻接表,二维列表构建邻接矩阵。图的遍历包括深度优先搜索(DFS)和广度优先搜索(BFS)。DFS使用递归,BFS借助队列。这些基础技巧对于解决复杂数据关系问题,如社交网络分析或迷宫求解,至关重要,能提升编程艺术。
13 5
|
3天前
|
数据可视化 PyTorch Serverless
Python 性能分析的几个方法,找到你代码中的那个她
我们在编写了一个脚本在笔记本上处理一些数据,然后去喝杯咖啡或者上了个厕所,15分钟后回来时发现进度才完成不到10%。 我们的脑袋里面就会发问:为什么这么慢?究竟是在哪个部分是慢的?是读取数据、处理数据还是保存数据?如何让它变快?它真的很慢吗? 有了这个疑问我们尝试去解决这个问题,下面我们介绍几个 python 性能分析的工具。
|
5天前
|
算法 计算机视觉 索引
python---OpenCv(二),背景分离方法较有意思
python---OpenCv(二),背景分离方法较有意思
|
1天前
|
数据可视化 Python
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
7 0
|
2天前
|
机器学习/深度学习 缓存 安全
Python标准库中的`str`类型有一个`translate()`方法,它用于替换字符串中的字符或字符子集。这通常与`str.maketrans()`方法一起使用,后者创建一个映射表,用于定义哪些字符应该被替换。
Python标准库中的`str`类型有一个`translate()`方法,它用于替换字符串中的字符或字符子集。这通常与`str.maketrans()`方法一起使用,后者创建一个映射表,用于定义哪些字符应该被替换。
4 0
|
6天前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
20 3
|
8天前
|
开发者 Python
Python元类实战:打造你的专属编程魔法,让代码随心所欲变化
【7月更文挑战第7天】Python的元类是编程的变形师,用于创建类的“类”,赋予代码在构建时的变形能力。
30 1
|
9天前
|
设计模式 存储 Python
Python元类大揭秘:从理解到应用,一步步构建你的编程帝国
【7月更文挑战第6天】Python元类是创建类的对象的基石,允许控制类的生成过程。通过自定义元类,可在类定义时动态添加方法或改变行为。
16 0
|
6天前
|
数据采集 大数据 数据安全/隐私保护
Python编程:如何有效等待套接字的读取与关闭
Python网络编程中,套接字事件处理至关重要。利用`selectors`模块和代理IP能增强程序的稳定性和可靠性。代码示例展示了如何通过代理连接目标服务器,注册套接字的读写事件并高效处理。在代理IP配置、连接创建、事件循环及回调函数中,实现了数据收发与连接管理,有效应对网络爬虫或聊天应用的需求,同时保护了真实IP。
Python编程:如何有效等待套接字的读取与关闭