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

系列文章目录

编程小白的自学笔记五(Python类的方法)

编程小白的自学笔记四(正则表达式模块search函数) 

编程小白的自学笔记三(Python正则表达式)


目录

系列文章目录

前言

一、静态方法

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

猜你喜欢

转载自blog.csdn.net/m0_49914128/article/details/131542156
今日推荐