定义类的方法,相信你会说,不就是在class语句下使用def () 就是定义类的方法了嘛,是的,这是定义的方法的一种,而且是最普通的方式

首先,我们已经知道有两种方式:

1.普通方法:

1)与类无关的方法

2)与类相关的方法:

能够被类直接调用的方法,而实例化因为没有self绑定,会把自身作为参数传参而报错

2.实例方法:

像这种必须实例化才能调用的方法,就是实例方法

其实还有两种方法,其实在上一篇博文里有伏笔的,我打开的@property的官方文档截图里就有的——@staticmethod,@classmethod,这两种方式也可以定义方法,那分别代表啥意思呢?接着看

@staticmethod

1.什么是@staticmethod

看英文单词,翻译过来就是静态方法,静态方法是一种普通函数,位于类定义的命名空间中,不会对任何实例类型进行操作。静态方法和在普通的非class的method作用是一样的,只不过是命名空间是在类里面。一般使用场景就是和类相关的操作,但是又不会依赖和改变类、实例的状态

2.怎么使用:

python为我们内置了函数staticmethod来把类中的函数定义成静态方法

3.作用:

  • 代码易读性.静态方法并不需要self参数
  • 节约内存.不用每个实例都实例化方法.
  • 在类内部控制静态方法.不然的话换一种实现方法,把函数放在在类外部......

@classmethod

1.什么是@classmethod

同样的,翻译英文就是类方法,就是可以被类直接使用的方法,不需要实例化给实例化对象使用的方法

2.怎么使用:

1):

看到了吗?类对象A,也可以直接使用class_test方法,而不需要实例化给对象再使用。是的,classmethod装饰的方法类也可以直接用,并且其内第一个参数是 cls,即代表类自身,如同self一样

看了上面的例子,相信你应该有所了解了。

2):既然使用@classmethod之后类就可以直接使用方法,我们知道在python中,一切皆对象,所以可以将类调用的方法赋值给另一个对象,这就是构造:

当然我这里只是作为打印使用,你可以给定你希望的结果,并赋值给其他对象。

3):@classmethod也可以被子类继承

3.作用:

@classmethod为python提供额外的构造器,主要用途是作为构造函数。Python只有一个构造函数__new__,如果想要多种构造函数就很不方便。只能在new里面写一堆代码。
有classmethod之后就可以用classmethod来写不同的构造函数,并且可以类与类之间进行交互等等。

@classmethod和@staticmethod的区别

虽然@classmethod和@staticmethod非常的相似,但是两者在具体的使用上还是有着细微的差别:classmethod必须使用类对象cls作为第一个参数,而staticmethod则可以不传递任何参数

洗礼灵魂,修炼python(47)--巩固篇—定义类的方法之@classmethod,@staticmethod的更多相关文章

  1. Python使用property函数定义属性访问方法如果不定义fget会怎么样?

    我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...

  2. Javascript中两种最通用的定义类的方法

    在Javascript中,一切都是对象,包括函数.在Javascript中并没有真正的类,不能像C#,PHP等语言中用 class xxx来定义.但Javascript中提供了一种折中的方案:把对象定 ...

  3. Python类中装饰器classmethod,staticmethod,property,

    @classmethod 有的时候在类中会有一种情况,就是这个方法并不需要使用每一个对象属性 因此 这个方法中的self参数一个完全无用的参数,使用classmethod class A: __cou ...

  4. python基础教程:定义类创建实例

    类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 >>>class Person(object): #所有的类都是从object类继承 pass #pass ...

  5. python 使用exec执行定义好的方法,提示“name 'XXX' is not defined”

    文件A中的exec(),调到了文件B中的方法,提示name is not defined exec()调用时,提示方法没有定义 试过了的方法: 1.百度上说是局部变量或者是全局变量之间的文件,然后在e ...

  6. Python笔记(5)类__方法与继承

    方法 类方法@classmethod,实例方法,静态方法@staticmethod,特殊方法,__init__ 形式上的区别:调用是通过类和实例进行,不能直接调用,有自己的特殊参数,如__init__ ...

  7. Python 中的函数与类的方法

    注:本文转译自 Stackoverflow 上 Adding a Method to an Existing Object 的最佳回答. 在 python 中,def 定义的函数与类中的方法有很大的不 ...

  8. C#语法糖之第三篇: 匿名类 & 匿名方法

    今天时间有点早,所以上来在写一篇文章吧,继续上一篇的文章,在我们平时编程过程中有没有遇到过这样的一个情景,你定义的类只是用来封装一些相关的数据,但并不需要相关联的方法.事件和其他自定义的功能.同时,这 ...

  9. javascript定义类的方法总结

    1.构造函数法 类是对象的模板,定义了对象共有的方法属性数据 等,在javascript中一个函数就是一个对象,也可以看做一个类的构造方法. 所以我们可以像以下方式定义类: //1.经典的构造方法 Q ...

随机推荐

  1. spring boot 集成freemarker

  2. [P4318] 完全平方数

    想不出什么办法能直接算的(别跟我提分块打表),不如二分答案吧:设\(f(x)=\sum_{i=1}^n [i不是"完全平方数"]\), 显然f(x)与x正相关.再结合筛法.容斥,不 ...

  3. 用eclipse导入打war包的maven项目

    最近遇到Maven管理下的Spring MVC项目,组内某位将项目代码扔过来,一脸懵逼(囧),查阅了一些资料后终于将此项目运行通了(>_<),特此记录下来与各位分享. 通俗的来说,Mave ...

  4. FF笔试题

    一.单选题 1.下列关于继承的描述错误的是(  ) A.  在Java中允许定义一个父类的引用,指向子类对象 B.  在Java中继承是通过extends关键字来描述的,而且只允许继承自一个直接父类 ...

  5. .net core通过发布nuget实现引用项目

    1 获取 api key 登录  https://www.nuget.org/account 进行api key获取操作 2 安装 nuget package explorer 3 进入要发布的项目目 ...

  6. 十余年软件开发经历,经验总结和程序一览(涉及Socket、WPF、vc++、CAD、图像、GIS)

    前言 本文主要介绍我开发的几款软件产品,大概介绍一下功能.可以让读者了解本人的开发能力,所擅长的方面.有相关开发需求可以联系作者. 本人开发软件多年,从事的行业也多种多样:自然接触了不同的业务,开发了 ...

  7. 详解C#的协变和逆变

    一.使用协变(Covariance)和逆变(Contravariance )能够实现数组之间.委托实例和方法之间.泛型委托实例之间.泛型接口的变量和泛型类型的对象之间.泛型接口的变量之间的隐式转换:使 ...

  8. 多线程读者写者问题--用QT实现

    先把代码贴上来,有时间再整理吧..因为工作中用Qt,所以用Qt实现的....刚上班,,忙! 三种方法,读者优先,写者优先和公平竞争.. 读者优先 #include <QCoreApplicati ...

  9. mysql更新表中日期字段时间

    DATE_ADD和DATE_SUB函数可以用INTERVAL关键字标识的时间间隔进行加减操作,类似于PHP中的strtotime函数. 1.更新表中有效期valid_time字段值都增加一天 UPDA ...

  10. PXE | 开关机

    PXE | 开关机流程 linuxPXE 主要阶段 引导的主要6个阶段 从MBR中读取引导加载程序boot loader 加载并初始化内核: 检测和配置设备: 创建内核进程: 系统管理员干预(单用户模 ...