Python类实例方法、静态方法以及类方法

前言

在对深度学习项目进行编码的过程中,会涉及到一些类的编写,比如数据加载类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的魔法函数(更多魔法函数可以参考:https://blog.csdn.net/u012655441/article/details/121625014)。同时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)

在实际编程中,几乎不会用到类方法和静态方法,因为我们完全可以使用函数代替它们实现想要的功能,但在一些特殊的场景中(例如工厂模式中),使用类方法和静态方法也是很不错的选择。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值