Python中classmethod和staticmethod

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

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

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

Python中classmethod和staticmethod_第1张图片

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

改写成以下代码:

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

运行结果:

Python中classmethod和staticmethod_第2张图片

确实可以正确运行了, 不过我们每次都是通过实例化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,都是可以的。

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

你可能感兴趣的:(Python)