如果您将某个东西定义为classmethod,这可能是因为您打算从类而不是类实例中调用它。

定义类方法的几种方式:

  1. 常规方式                         : 需要self隐士传递当前类对象的实例。
  2. @classmethod 装饰器修饰  :需要通过cls参数传递当前类对象
  3. @staticmethod  装饰器修饰 :与普通函数是一样
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.foo() #executing foo(<__main__.A object at 0x0000000001E9B488>, )
a.class_foo() #executing class_foo(<class '__main__.A'>, )
a.static_foo() #executing static_foo() #@classmethod修饰方法调用: 类对象或对象实例调用
A.class_foo() #executing class_foo(<class '__main__.A'>, )
a.class_foo() #executing class_foo(<class '__main__.A'>, ) # 通过类对象 访问常规方法即没有修饰符的方法
A.foo(a,) #executing foo(<__main__.A object at 0x000000000284C488>, )

其他案例:

class A(object):
def __init__(self,name):
self.name = name def foo(self, x):
print("executing foo(%s, %s, %s)" % (self, x,self.name)) @classmethod
def class_foo(cls, x):
print("executing class_foo(%s, %s)" % (cls, x))
# 返回一个实例对象
return cls(x) @staticmethod
def static_foo(x):
print("executing static_foo(%s)" % x) dd = A.class_foo(2) # executing class_foo(<class '__main__.A'>, 2)
print(dd.name) #
dd.foo(3) # executing foo(<__main__.A object at 0x0000000001E8B708>, 3, 2)
class CeShi:
name = '测试'
def __init__(self,x,y):
self.x = x
self.y = y @property #在CeShi_add函数前加上@property,使得该函数可直接调用,封装起来
def CeShi_add(self):
return self.x + self.y #在CeShi_info函数前加上@classmethon,则该函数变为类方法,
@classmethod #该函数只能访问到类的数据属性,不能获取实例的数据属性
def CeShi_info(cls): #python自动传入位置参数cls就是类本身
print('这是一个%s'%cls.name) #cls.CeShi_name调用类自己的数据属性 CeShi.CeShi_info()

python3 @classmethod 和 @staticmethod 的区别的更多相关文章

  1. python classmethod 和 staticmethod的区别

    https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner 1. ...

  2. python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property

    一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...

  3. Python中的实例方法、classmethod和staticmethod的区别

    class NewsPaper(object): # 类属性 __print_times = 0 # 下划线表示私有属性 # 实例方法 def __init__(self, title, conten ...

  4. Python中classmethod和staticmethod的区别

    学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用. staticmethod:静态方法 classmethod:类方法 在python中,静态方法和类方法都 ...

  5. 洗礼灵魂,修炼python(47)--巩固篇—定义类的方法之@classmethod,@staticmethod

    定义类的方法,相信你会说,不就是在class语句下使用def () 就是定义类的方法了嘛,是的,这是定义的方法的一种,而且是最普通的方式 首先,我们已经知道有两种方式: 1.普通方法: 1)与类无关的 ...

  6. python @classmethod和@staticmethod区别

    python 类方法和静态方法区别 python @classmethod和@staticmethod区别 Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢 ...

  7. python的@classmethod和@staticmethod

    本文是对StackOverflow上的一篇高赞回答的不完全翻译,原文链接:meaning-of-classmethod-and-staticmethod-for-beginner Python面向对象 ...

  8. Fluent Python: Classmethod vs Staticmethod

    Fluent Python一书9.4节比较了 Classmethod 和 Staticmethod 两个装饰器的区别: 给出的结论是一个非常有用(Classmethod), 一个不太有用(Static ...

  9. 面向对象封装 classmethod和staticmethod方法

    接口类 接口类:是规范子类的一个模板,只要接口类中定义的,就应该在子类中实现接口类不能被实例化,它只能被继承支持多继承接口隔离原则:使用多个专门的接口,而不使用单一的总接口.即客户端不应该依赖那些不需 ...

随机推荐

  1. nmap中文帮助文档

    简介: Nmap(“ Network Mapper ”)是用于网络探索和安全审核的开源工具.它设计用于快速扫描大型网络,尽管它可以在单个主机上正常运行.Nmap以新颖的方式使用原始IP数据包来确定网络 ...

  2. Ubuntu系统---Ubuntu16.04进不了界面(登录界面循环,密码正确)(一体化安装(CUDA +NVIDIA驱动)+ cuDNN)

                                                 Ubuntu16.04进不了界面(登录界面循环,密码正确)(一体化安装(CUDA +NVIDIA驱动)+ cu ...

  3. MySQL进阶5--分组函数 / 分组排序和分组查询 group by(having) /order by

    MySQL进阶--分组排序和分组查询 group by(having) /order by /* 介绍分组函数 功能:用做统计使用,又称为聚合函数或组函数 1.分类: sum, avg 求和 /平均数 ...

  4. #Python绘制 文本进度条,带刷新、时间暂缓的

    #Python绘制 文本进度条,带刷新.时间暂缓的 #文本进度条 import time as T st=T.perf_counter() print('-'*6,'执行开始','-'*6) maxx ...

  5. ubuntu下后台服务的管理

    注册后台服务后都有脚本存在/lib/systemd/system路径下 如mysql为mysql.service 被service管理的进程被杀掉还是会重启的 应使用service XXX stop停 ...

  6. P1396 营救[最短路+二分]

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

  7. 开发神技能 | Python Mock 的入门

    Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代 ...

  8. Redis做消息队列

    1.连接从Redis中获取日志文件并存储到ES中 [root@Logstash ~]# vim /usr/local/logstash/config/redis.conf input {     be ...

  9. Java 实现简单的SQL动态组装工具类

    第一版 package com.zh.oukele.util; import java.util.HashMap; import java.util.Iterator; import java.uti ...

  10. JS 框架安全报告:jQuery 下载次数超过 1.2 亿次

    尽管 JavaScript 库 jQuery 仍被使用,但它已不再像以前那样流行.根据开源安全平台 Snyk 统计,目前至少十分之六的网站受到 jQuery XSS 漏洞的影响,甚至用于扩展 jQue ...