一直搞不明白,类方法和静态方法的区别,特意研究了一下,跟大家分享一下。

为了方便大家了解两者的差别,以下的示例代码将有助于发现其中的差别:

class A(object):

def foo(self, x):

print "executing foo(%s, %s)" % (self, x)

@classmethod

def class_foo(cls, x):

print "executing class_foo(%s, %s)" % (cls, x)

@staticmethod

def static_foo(x):

print "executing static_foo(%s)" % x

a = A()

以下是对象实例调用方法的常用方法,对象实例a作为第一个参数隐式传递。

a.foo(1)

# executing foo(<__main__.a object at>,1)

使用classmethods时,对象实例的类作为第一个参数而不是隐式传递self。

a.class_foo(1)

# executing class_foo(,1)

您也可以class_foo使用该类进行调用。

实际上,如果您将某些东西定义为类方法,则可能是因为您打算从类而不是从类实例调用它。

A.foo(1)本来会引发TypeError,但A.class_foo(1)效果很好:

A.class_foo(1)

# executing class_foo(,1)

人们发现类方法的一种用途是创建可继承的替代构造函数。

使用staticmethods时,self(对象实例)和 cls(类)都不会隐式传递为第一个参数。它们的行为类似于普通函数,只是您可以从实例或类中调用它们:

a.static_foo(1)

# executing static_foo(1)

A.static_foo('hi')

# executing static_foo(hi)

特别注意此句:

静态方法用于对与类之间具有某种逻辑联系的函数分组。

foo只是一个函数,但是当您调用a.foo它时,不仅获得该函数,还会获得该函数的“部分应用”版本,该对象实例a绑定为该函数的第一个参数。foo期望有2个参数,而a.foo只期望有1个参数。

a势必到foo。这就是下面的术语“绑定”的含义:

print(a.foo)

# >

与a.class_foo,a不绑定class_foo,而是与类A绑定class_foo。

print(a.class_foo)

# >

在这里,使用静态方法,即使它是一种方法,也a.static_foo只是返回一个没有绑定参数的良好的'ole函数。static_foo期望有1个参数,也 a.static_foo期望有1个参数。

print(a.static_foo)

#

当然,当您static_foo使用类进行调用时,也会发生同样的事情A。

print(A.static_foo)

#

总结一下彼此的调用区别:

python中@staticmethod_Python中的@staticmethod和@classmethod的区别相关推荐

  1. python静态方法的作用_@staticmethod和@classmethod如何作用于python中的...

    您的类方法和静态方法都只能更改类级变量.问题是这样做时,您已经在实例变量s1中隐藏了类变量num: s1.num = s1.num + 5 这将创建一个实例变量,该实例变量遮盖了实例名称空间中的类变量 ...

  2. python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用

    python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用(3-20181205) 文章目录: 一. @staticmetho ...

  3. Python基础——@staticmethod与@classmethod

    @staticmethod与隐式的静态成员方法的区别在于是否允许实例对象调用该静态方法(后者是不允许的) @staticmethod与@classmethod的区别在于后者无论是被实例调用还是被类对象 ...

  4. python 中的static-method (静态函数), classmethod(类函数 ), 成员函数

    python 中的static-method (静态函数), classmethod(类函数 ), 成员函数 简介 类似Java.CPP中的类,可以定义static method.class meth ...

  5. python中的classmethod_面试题:python 中 staticmethod 和 classmethod有什么区别

    面试中经常会问到staticmethod 和 classmethod有什么区别? 首先看下官方的解释: staticmethod: class staticmethod staticmethod(fu ...

  6. Python中的staticmethod和classmethod

    在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法. 类方法 ...

  7. python classmethod 的cls_Python中的@staticmethod,@classmethod,self,cls到底是什么意思?...

    普通类方法 在Python中,通常我们调用某个类的方式,首先要实例化一个对象才能调用该类的方法,比如: # _*_ coding:utf-8 _*_ class People: def hello(s ...

  8. python decorator. decorator_Python中decorator使用实例

    在我以前介绍 Python 2.4 特性的Blog中已经介绍过了decorator了,不过,那时是照猫画虎,现在再仔细描述一下它的使用. 关于decorator的详细介绍在 Python 2.4中的W ...

  9. python 类不实例化方法:@staticmethod或@classmethod

    讲解一 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码, ...

最新文章

  1. 列表组件之RecyclerView
  2. Android QQ、微信聊天消息界面设计原理与实现
  3. Swift 单元测试
  4. python中换行的转义符_详解Python中的各种转义符\n\r\t
  5. for(auto c:s)与for(auto c:s)
  6. Jiaozi帮忙买的Secret Garden的票拿到了,谢谢Jiaozi
  7. 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之移动端开发随笔二
  8. unbuntu管理员的切换
  9. 苹果允许员工公开讨论薪资引热议...
  10. 怎样取消计算机中镜像,win7系统,如何删除之前创建的镜像文件。 (不是在系统保护里头删除还原点,我试过了)...
  11. 页面删除android4.0 Launcher仿三星平板workspace页面编辑(即页面增减)
  12. Linux cJSON
  13. c语言中fprintf的作用,C语言中fprintf函数介绍
  14. linux解压tar文件夹
  15. linux RDP 共享磁盘,USB Over Network - USB Server for Linux (RDP使用讀卡機殘念)
  16. Mysql8中降序索引的底层实现
  17. ChemDraw使用不了怎么办
  18. 海洋cms(海洋视频内容管理系统) v12.5 bulid220618
  19. MPU6050加速度传感器学习笔记之传感器
  20. SANER 2018 论文阅读- Dissection of a Bug Dataset: Anatomy of 395 Patches from Defects4J

热门文章

  1. 用重构指导Clean Code(二):依恋情结和switch语句
  2. 译 | 将数据从Cosmos DB迁移到本地JSON文件
  3. 基于 Kubernetes 的微服务部署即代码
  4. 【.NET Core 3.0】框架之十二 || 跨域 与 Proxy
  5. 结合使用 Draft 与 Tencent Kubernetes Engine (TKE)
  6. IdentityServer4实战 - JWT Token Issuer 详解
  7. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...
  8. DevOps/.NET 微服务 秋季分享会领优惠门票
  9. ASP.NET Core + Docker + Jenkins + gogs + CentOS 从零开始搭建持续集成
  10. gRPC官方快速上手学习笔记(c#版)