详解Python中@staticmethod和@classmethod区别及使用示例代码

本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别。

1、@staticmethod和@classmethod区别

@staticmethod:静态方法

@classmethod:类方法

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用

使用:直接类名.方法名()来调用。@staticmethod和@classmethod都可以直接类名.方法名()来调用,

@staticmethod不需要表示自身对象的self和自身类的cls参数(这两个参数都不需要添加),就跟使用函数一样。

使用:直接类名.属性名或直接类名.方法名。

@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

使用:直接类名.属性名或直接类名.方法名。

两者定义的装饰器调用方法一样,但是@classmethod装饰器定义的类方法需要传入类参数cls。

@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。

而@classmethod有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码更灵活。

2、@staticmethod和@classmethod使用示例代码

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 0xb7dbef0c>,1)
#对于类方法,对象实例的类将隐式地作为第一个参数而不是传递self
a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
#使用这个类调用class_foo
A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
#对于staticmethods,self(对象实例)和cls(类)都不会作为第一个参数隐式传递。它们的行为类似普通函数,除了你可以从实例或类中调用它们
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
 

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

到此这篇关于详解Python中@staticmethod和@classmethod区别及使用示例代码的文章就介绍到这了,更多相关Python @staticmethod和@classmethod内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析

    本文实例讲述了Python 类方法和实例方法(@classmethod),静态方法(@staticmethod).分享给大家供大家参考,具体如下: demo.py(类方法,@classmethod): class Tool(object): # 使用赋值语句定义类属性,记录所有实例化工具对象的数量 count = 0 # @classmethod 定义类方法. 第一个参数是cls (cls用于访问类属性和类方法,不能访问实例属性/方法) @classmethod def show_tool_co

  • 详解Python中@staticmethod和@classmethod区别及使用示例代码

    本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别. 1.@staticmethod和@classmethod区别 @staticmethod:静态方法 @classmethod:类方法 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用 使用:直接类名.方法名()来调用.@staticmethod

  • 详解Python中is和==的区别

    在Python中一切都是对象. Python中对象包含的三个基本要素,分别是: id(身份标识) type(数据类型) value(值) 对象之间比较是否相等可以用 == ,也可以用 is . is 和 == 都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同.下面来看看具体区别在哪? is 比较的是两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址. == 比较的是两个对象的内容是否相等,默认会调用对象的 __eq__ 方法. == 是pytho

  • 详解python中executemany和序列的使用方法

    详解python中executemany和序列的使用方法 一 代码 import sqlite3 persons=[ ("Jim","Green"), ("Hu","jie") ] conn=sqlite3.connect(":memory:") conn.execute("CREATE TABLE person(firstname,lastname)") conn.executeman

  • 基于python中staticmethod和classmethod的区别(详解)

    例子 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(

  • 详解python中@classmethod和@staticmethod方法

    在python类当中,经常会遇到@classmethod和@staticmethod这两个装饰器,那么到底它们的区别和作用是啥子呢?具体来看下. @classmethod :默认有一个cls参数,用类或对象都可以调用. @staticmethod:静态方法,无默认参数,用类和对象都可以调用. 1.@staticmethod: 我们看下代码: class A: def f1(x): print(x) A.f1(2) # 2 类.函数 创建一个类,通过类调用函数. class A: @staticm

  • 详解python中静态方法staticmethod用法

    在开发的时候, 可以使用类对方法进行封装,如果某一个方法需要访问到对象的实例属性,可以把这个方法封装成一个实例方法.如果某一个方法不需要访问对象的实例属性,但是需要访问到类的类属性,这个时候就可以考虑把这个方法封装成一个类方法.一个实例方法, 一个类方法,这是两种方法类型,但是在开发中还有一种情况,如果要封装的某一个方法,既不需要访问到对象的实例属性,也不需要访问类的类属性,这个时候就可以考虑把这个方法封装成一个静态方法. 在开发中,如果类中的某个方法既不需要访问实例属性或者调用实例方法,同时也

  • 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

    详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别 os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方式的区别和选择. os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那

  • 详解Python中sorted()和sort()的使用与区别

    目录 sort()方法是什么 如何妙用sorted() 方法 总结 在 Python 中,你可以使用 sorted() 方法或 sort() 方法对数据进行排序. 在本文中,我将提供 sorted() 和 sort() 方法的代码示例,并解释两者之间的区别. sort()方法是什么 此方法接受一个列表并对其进行排序.但,请记住此方法没有返回值,即返回None. 下面例子中,我们有一个数字列表,我们可以使用 sort() 方法按升序对列表进行排序. my_list = [67, 2, 999, 1

  • 详解Python中range()与xrange()的区别

    目录 前言 返回类型 记忆 操作使用 Speed 前言 range() 和 xrange() 是两个函数,可用于在 Python的 for 循环中迭代一定次数.在 Python 3 中,没有 xrange,但 range 函数的行为类似于 Python 2 中的 xrange.如果要编写可在 Python 2 和 Python 3 上运行的代码,则应使用 range(). range()  – 这将返回一个范围对象(一种可迭代的类型). xrange()  – 此函数返回生成器对象,该生成器对象

  • 详解Python中import机制

    Python语言中import的使用很简单,直接使用import module_name语句导入即可.这里我主要写一下"import"的本质. Python官方定义: Python code in one module gains access to the code in another module by the process of importing it. 1.定义: 模块(module):用来从逻辑(实现一个功能)上组织Python代码(变量.函数.类),本质就是*.py文

随机推荐