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

举报
踏破千重浪 发表于 2023/08/14 20:05:41 2023/08/14
【摘要】 目录系列文章目录前言一、静态方法1、静态方法可以不带参数。2、 静态方法无法获取实例3、静态方法可以传其他参数 二、动态方法总结前言今天我们继续昨天的学习,学习python类的方法。Python中的类有两种方法:静态方法和动态方法,它们在使用时有一些不同的特点。下面我们来详细讲解下:一、静态方法静态方法是在方法名上加一行“@staticmenthod”修饰符来指定该方法为静态方法,这个英文单...

目录

系列文章目录

前言

一、静态方法

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

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

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

二、动态方法

总结

前言
今天我们继续昨天的学习,学习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中都是类中定义的方法,用于实现类的功能。静态方法与实例无关,可以直接使用类名调用;动态方法与实例相关,需要通过实例调用。静态方法不会自动传递任何参数,需要在调用时显式传递;动态方法自动将实例作为第一个参数传递给该方法。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。