Python3 @classmethod 函数装饰器 声明一个类方法

@classmethod函数装饰器的主要作用是将一个类的普通方法(需要实例化使用)声明为一个类方法(可以直接使用类名调用)。在类的功能扩展(包括功能的整合以及类的继承),代码整洁度,后期的可维护性起到一定的帮助。虽然类方法也可以在实例化后,使用实例化对象进行调用,但这是不赞成的,因为这样会容易将它和普通的实例化方法混淆,后期代码不利于维护。具体是否使用以及其是方法方式还需要根据业务的实际需要决定。

它是Python的内置函数,在python文件中直接可以使用。它只能被应用在类(class)中。

语法

class main:

@classmethod

def run(cls, arg1, arg2, ...):

...

参数

cls(必须) - 当前类本身

arg1,arg2 - 自定义参数

实例

§ 实例1 - @classmethod的使用方法

代码及运行结果:

#先声明类

class main:

#普通方法

def set(self, x):

print(x)

#类方法

@classmethod

def run(cls, n):

print(n)

#普通方法需要实例化后才能调用

o = main()

o.set('abc')

#输出

abc

#类方法可以直接使用,不需要实例化

main.run(123)

#输出

123

§ 实例2 - @classmethod的使用场景之代码整合

有时我们可能会遇到一些情况,在创建类的时候只有一种可能性,但是在实际业务发展过程中将演变出多种可能性,这时需要在外部处理好参数,然后再实例化类,将参数传递给类。如果多个模块调用这个类,必然会产生一定的混乱。如果将这个处理过程以一个普通方法的方式编写在类中,又必须先实例化类,然后才能调用,但是这样会导致先触发类的初始化方法__init__()以及__repr__()、__set__()等等。可是我们的类是需要先把参数处理好,然后才能初始化,否则会出问题的,这可能导致整个类的业务逻辑方式改变。造成大量的修改。

代码及运行结果:

#创建一个类

class Date(object):

def __init__(self, year, month, day):

self.year = year

self.month = month

self.day = day

def print_date(self):

print(self.year, self.month, self.day)

#实例化类

data_object = Date('2018','10','31')

#执行输出函数

data_object.print_date()

2018 10 31

#在上面的例子中可以看到类的实例化需要传递‘年月日’三个参数。并且是要求分别传递。那么假设用户不按照要求填写,他填写的2018-10-31这样的一个参数呢?

#我们需要先对参数进行分割处理,然后再实例化类。例如下面的代码:

#分割函数

def from_string(date_as_string):

return map(int, date_as_string.split('-'))

#创建类

class Date(object):

def __init__(self, year, month, day):

self.year = year

self.month = month

self.day = day

def print_date(self):

print(self.year, self.month, self.day)

#先执行分割函数对数据进行处理

year, month, day = from_string('2018-10-31')

#实例化类

data_object = Date(year, month, day)

#执行输出函数

data_object.print_date()

2018 10 31

#这样做视乎可以解决这个问题,但是from_string方法应该是属于类的一部分,现在需要写在外部,就导致了类功能外散,后期不便于管理,以后增加功能的时候会出现问题,所以我们就必须将from_string迁移到类里面去,并且还要在类的实例化之前调用它,我们都知道,一般情况下,如果想调用类中的方法,必须先实例化类,而我们现在的需求是要在实例化之前。这时就需要使用@classmethod咯。代码如下:

#创建一个类

class Date(object):

def __init__(self, year, month, day):

self.year = year

self.month = month

self.day = day

def print_date(self):

print(self.year, self.month, self.day)

#声明类方法

@classmethod

def from_string(cls, date_as_string):

year, month, day = map(int, date_as_string.split('-'))

return cls(year, month, day) #实例化类并返回实例化对象

data_object = Date.from_string('2018-10-31')

#执行输出函数

data_object.print_date()

2018 10 31

#这是一个比较经典的案例,来自于stackoverflow。我暂时没有想到更好的,就先对原案例进行了一些修改并且加上了一些注释。

#使用@classmethod可以有效的防止类功能外散,可以将对属于当前类的功能集中起来,便于管理,并且对类的继承、重载、多态都是有一定的帮助,这个小例子只能算是一个用法说明,在实际的操作中会有更加复杂的用法,还需要以项目的实际业务逻辑来制定。

§ 实例3 - @classmethod使用场景之类的重载

代码及运行结果:

#声明一个类

class main:

#声明类方法

@classmethod

def run(cls):

#调用name方法

cls.name()

#声明name类方法

@classmethod

def name(cls):

print('我是main类的name方法')

#声明子类并继承main类

class main2(main):

#重载基类的name方法

@classmethod

def name(cls):

print('我是main2类的name方法')

main2.run()

#我是main2类的name方法

#输出结果是子类的重载name方法。因为cls指向的永远都是调用那个类。

python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法相关推荐

  1. python 函数修饰器 父类_手把手教你学python第十四讲(函数装饰器,super用法和时间处理)...

    文中有些字在图中是因为每篇文章最多100张图片,我把有的小图片和文字一起截图了,文中所有的引用都会标出原文网址,除此以外都是作者原创. 有时候会在文章最前或者最后补充一些知识或者把前面说的有问题的地方 ...

  2. python function at 0x00000_Python 中的函数装饰器和闭包

    本文是<流畅的Python>第7章的学习笔记. 函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另 ...

  3. [转载] 扩展Python之在Python中调用C编写的函数模块

    参考链接: 如何在Python中调用C函数 目录 编写Python扩展1. 创建应用代码2. 根据样板编写封装代码2.1 包含Python头文件2.2 为每一个模块函数添加形如PyObject* *M ...

  4. Python中类调用类外面的函数

    #!/usr/bin/python3 #创建类 class cf():a = input("输入a:")b = input("输入b:")a = int(a)b ...

  5. java声明一个函数_java – 如何声明一个函数参数来接受抛出的函数?

    问题是Java有 checked exceptions但Kotlin没有. requestFunc参数type() – >列表与LT;窗口小部件>将映射到功能接口 Function0> ...

  6. Python(IT峰)笔记12-装饰器概念,装饰器的原型,装饰器的嵌套,装饰带有参数的函数,装饰器的嵌套,装饰带有多参数的函数,带有参数的装饰器,用类方法装饰函数,用韩式装饰器装饰类,用类装饰器装饰类

    1.装饰器decorator概念 在不改变原有函数代码,且保持原函数调用方法的基础上,给原函数增加新的功能(给类增加属性或方法) 用一个函数或类去装饰一个旧函数(或类)造出一个新函数(或新类) 在原有 ...

  7. python--第六章 python函数 装饰器 类 对象

    一.装饰器 1.什么是装饰器 ''' 装饰器''' # 创建几个函数 def add(a,b):'''求任意两个数的和'''print('计算开始:')r = a + breturn rprint(' ...

  8. python装饰器-Python @函数装饰器及用法(超级详细)

    前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod.@classmethod 和 @property,其中 staticmethod().class ...

  9. 【李刚-21天通关Python-27】之 案例实操:函数装饰器应用

    [李刚-21天通关Python-27]之 案例实操:函数装饰器应用 一.函数装饰器的广泛应用 @staticmethod 和 @classmethod 的本质就是函数装饰器 staticmethod ...

最新文章

  1. arcgis 快速制图插件_51GIS学院|ArcGIS空间数据分析系列课程的27个视频
  2. python 命令-新手向——用python编写命令行应用的简洁方式
  3. LibJson数据解析方法
  4. 02python 中的线程
  5. php第一行空白,网页头部多出一行空白问题的解决方法 (PHP文件头BOM问题)
  6. Teams数据统计 - 聊天消息
  7. python中ht表示什么_如何看待某国内大公司Python面试题,有关dict中初始化为固定值?...
  8. 理解saltstack 里cmd.run 配合onlyif和unless使用
  9. Vue:You may use special comments to disable some warnings.
  10. 史上最全的大数据学习资源(Awesome Big Data)
  11. 【解决方案】IPv6的445端口被运营商封禁,导致无法正常使用Windows共享文件夹
  12. 虚拟机之Jvm、dalvik、art联系和区别
  13. opencv实现matlab的median()函数
  14. 《淘宝店铺营销推广一册通》一2.2 选择店铺行业
  15. mysql笛卡尔积查询很慢_浅谈MySQL使用笛卡尔积原理进行多表查询
  16. 人脸对齐算法调研(Face Alignment)
  17. 内部总线、系统总线、外部总线
  18. SQL渗透与防御——(三)SQL盲注
  19. 2018-5-18笔记
  20. Java 获取 CPU 占用率

热门文章

  1. 【spring】动态代理
  2. Pytorch源码与运行原理浅析--网络篇(一)
  3. [翻译]Python中yield的解释
  4. 梯度下降优化算法概述
  5. Java集合详解之Map
  6. MyBatis批量插入几千条数据慎用foreach
  7. 分布式,集中式,云原生存储技术
  8. MXNet 图优化与算子融合
  9. GPU加速库AmgX
  10. 无人驾驶汽车开发平台,加速无人驾驶汽车的商业化