Python中classmethod和staticmethod

本文介绍了Python中classmethod和staticmethod的区别与用法。类方法classmethod允许直接通过类调用,而不通过实例,常用于与类相关的计算。静态方法staticmethod则不绑定到类或对象,与普通函数相似,但放在类内部方便组织代码。文中通过实例演示了两者的使用场景和调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里简单介绍一下自己对于classmethods和staticmethods的认识,。

首先是类方法, 在Python中指的时与类相关的方法, 而不与对象相关的方法, 也就是说这个方法是绑定在类上的, 比如我们要写一个方法统计这个类被调用了多少次

class A():
	a = 0
	def __init__(self):
		a += 1
	def get_a():
		return a
运行后出现错误:

原因是, 类和对象并不在同一个作用域或者说命名空间范围内, 因此在类命名空间内所定义的a=0,在类的实例中并不存在a这一变量, 因此对a+=1就会出现局部变量a并没有定义的错误

改写成以下代码:

class A():
	a = 0
	def __init__(self):
		A.a += 1
	def get_a(self):
		return A.a

运行结果:

确实可以正确运行了, 不过我们每次都是通过实例化A后得到A的对象, 通过对象来访问类的属性的, 而如果我们想要避免与对象进行交互,而只与类进行交互, 也就是不传递self参数给方法的话, 当然也可以在类的外部写一个函数, 但是对于代码的可维护性来说并不好, 因此最好能将方法写在类中, 但是又要保证它是一个类方法, 只与类进行交互, 此时可以使用staticmethods方法, 声明其为类方法

class A():
	a = 0
	def __init__(self):
		A.a += 1
	@classmethod
	def get_a(A):
		return A.a

实际的运行结果是如果没有用装饰器函数classmethod的话, 使用A().get_a()也是可行的, 我是在Python3.6的环境下测试的, 但是如果想要直接使用A.get_a()则会报错, 需要使用A.get_a(A), 在使用装饰器函数classmethod后就可以直接使用A.get_a()来访问类的属性a, 可以假定在使用了@classmethod后, A.get_a()默认会将类A传递给get_a()中的参数A,也就是传递的第一个参数是类。而对于staticmethod方法, 简单说就是让与类与对象紧密相关的某个函数由原来的放在类的外部, 转而放在类里面, 作为一个静态的方法。

代码如下:

sex = 'man'
def is_man():
	if 'man' == sex:
		return True
	else:
		return False
class A():
	def __init__(self, name):
		self.name = name
	def hello(self):
		if is_man():
			print('Hello, %s, you are a real man!' % self.name)
运行结果:

使用staticmethod方法可以对其进行改写:

class A():
	def __init__(self, name):
		self.name = name
	@staticmethod
	def is_man():
		if 'man' == sex:
			return True
		else:
			return False
	def hello(self):
		if self.is_man():
			print('Hello, %s, you are a real man!' % self.name)

运行结果如下:

对于静态方法, 类和对象都能够访问的, 此处可以使用self.is_man,也可以使用A.is_man,都是可以的。

以上只是自己的认识, 也借鉴了很多博客和文章内容, 存在很多不足之处,欢迎大家给我之处错误, 一定认真改正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值