定义类的方法,相信你会说,不就是在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. 卡尔曼滤波+单目标追踪+python-opencv

    很好的入门资料 向面试官一句话解释卡尔曼滤波: 用上一次的最优状态估计和最优估计误差去计算这一次的先验状态估计和先验误差估计: 用1得到的本次先验误差估计和测量噪声,得到卡尔曼增益: 用1,2步骤得到 ...

  2. 【xsy2332】Randomized Binary Search Tree DP+FFT

    题目大意:给你一个$[0,1]$之间等概率随机序列,你需要把这个序列插入到一棵$treap$中,问这棵$treap$的期望深度,请对于$[1,n]$中的每个深度分别输出它的概率(实数,保留五位小数). ...

  3. [P2402] 奶牛隐藏

    二分答案+最大流. 对答案建图,若长度≤答案,连边即可.(先要预处理点对间的最短路) 当然得拆点,(否则,就此题而言,就会出现流量x-y不走x-y的最短路边的情况,而是走了一条路径 ,答案约束的仅仅是 ...

  4. nohup后台执行

    由于使用nohup时,会自动将输出写入nohup.out文件中,如果文件很大的话,nohup.out就会不停的增大,这是我们不希望看到的,因此,可以利用/dev/null来解决这个问题. nohup ...

  5. 源码编译安装lnmp环境

    一.源码编译安装步骤 首先说明源码安装的好处   速度快,可自定义路径 主要有三步:1.配置 进入源码安装包  ./configure --prefix=/uer/local/nginx  可指定参数 ...

  6. CentOS+Nginx+Supervisor部署ASP.NET Core项目

    对.Net Core的学习和实践,已经进行了一年多的世间,截止目前,微软已经发布.Net Core2.1,关于.NetCore的应用部署的文章比比皆是.今天借此,回顾下.net core环境的部署过程 ...

  7. Java 中三大构建工具:Ant、Maven和Gradle

    Java世界中主要有三大构建工具:Ant.Maven和Gradle 目前:Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. Maven的主要功能主要分为5点,分别是依赖管理系统 ...

  8. Android 内存溢出解决方案(OOM) 整理总结<转>

    在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,今天在不同型号的三款安卓手机上做了测试,因为有效果也有结果,今天小马就做个详细的总 ...

  9. leetcode — 3sum

    import java.util.*; /** * Source : https://oj.leetcode.com/problems/3sum/ * * Created by lverpeng on ...

  10. javascript Uncaught ReferenceError: 方法名 is not defined

    前言: 那天我犯了这样一个低级错误,如果按照这样下去,根本在这条路上走不远.错的太离谱,把代码拿出来自己笑笑,等摆脱菜鸟之名的时候再回来好好的告诉自己,都是这么过来的,原来以前我菜的这么离谱.. 错误 ...