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