文章目录
- 前言
- 实例方法
- 类方法
- 静态方法
前言
在对深度学习项目进行编码的过程中,会涉及到一些类的编写,比如数据加载类dataloader,各种模型的类如Deeplab、Yolo,回调callbacks类等。在整个过程中也可以看出类在深度学习代码中占有重要分量。因此这篇文章主要介绍python的类和对应的类方法、静态方法以及实例方法。
Python的类方法具体可以分为类方法、实例方法和静态方法。类方法使用@classmethod
修饰的。静态方法是采用@classmethod
修饰的。没有任何修饰的方法为实例方法。
实例方法
实例方法比较常见,如下代码所示:
class MyClass:
def __init__(self):
self.a = 1
self.b = 2
def getitem(self):
print(self.a)
上面类定义里面,有__init__
的构造方法,它也属于实例方法并且属于python的魔法函数(更多魔法函数可以参考:)。同时MyClass
类里面定义了getitem
类方法。两个方法可以看出都有同一个共同点:至少要包含一个self
参数,用于绑定调用此方法的实例对象。调用实例方法如下:
test = MyClass()
test.getitem()
类方法
Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls
。在调用类方法时,无需显式为 cls 参数传参。
class MyClass:
def __init__(self):
self.a = 1
self.b = 2
def getitem(self):
print(self.a)
@classmethod
def info(cls):
print('正确调用类方法')
调用方式:
test = MyClass()
test.info()
应用场景:
静态方法有点像附属于类对象的“工具”。与普通函数不同,调用静态方法时,只能通过类对象(或者实例对象),而不能脱离类对象使用,即静态方法被‘束缚’在类对象中。比如,创建一个pizza类对象:
import math
class Pizza(object):
"""模拟pizza店接收顾客自定义订购pizza"""
def __init__(self, ingredients, radius):
self.ingredients = ingredients
self.radius = radius
def show_ingredients(self):
# 选购pizza食材
pass
def show_size(self):
# 选购pizza大小
pizza_size = self.cal_area(self.radius)
return pizza_size
@staticmethod
def cal_area(r):
return int(math.pi * r * r)
if __name__ == '__main__':
# 测试一下,半径为20厘米的pizza大小,如果顾客觉得大了,订一个小一点的
print(Pizza.cal_area(20))
# 经过上述测试,发现半径为20厘米的pizza有点大,订购一个小一点的
# 创建pizza实例对象
my_pizza = Pizza('番茄牛肉pizza', 15)
pizza_size = my_pizza.show_size()
# pizza大小合适,满意
print(pizza_size)
上述Pizza类中的静态方法,不仅提供了测试功能,还将计算pizza大小的逻辑从show_size()方法中抽离出来,如果需要修改cal_area()方法的内部处理逻辑,只需要修改该方法,而不需要修改show_size(),这样有利于代码的后期维护。
静态方法
静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。静态方法需要使用@staticmethod
修饰,例如:
class MyClass:
def __init__(self):
self.a = 1
self.b = 2
def getitem(self):
print(self.a)
@classmethod
def info(cls):
print('正确调用类方法')
@staticmethod
def info2(a, b):
print(a, b)
调用方式:
test = MyClass()
test.info2(1,2)
在实际编程中,几乎不会用到类方法和静态方法,因为我们完全可以使用函数代替它们实现想要的功能,但在一些特殊的场景中(例如工厂模式中),使用类方法和静态方法也是很不错的选择。