python中classmethod与staticmethod的差异及应用

类中三种函数的应用

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class TClassStatic(object):
    def __init__(self, data):
        self.data = data

    def printself(*arg):
        # for item in arg:
            # print item.data
        print("printself: ", arg)

    @staticmethod
    def smethod(*arg):
        print("stattic: ", arg)

    @classmethod
    def cmethod(*arg):
        print("class: ", arg)

def main():
    obj = TClassStatic(10)
    obj.printself()
    obj.smethod()
    obj.cmethod()

if __name__ == "__main__":
    main()

通过三种函数的调用可以很清楚的看出,各种函数的默认参数,输出结果如下:

(‘printself: ‘, (<__main__.TClassStatic object at 0x6ffffe22910>,))
(‘stattic: ‘, ())
(‘class: ‘, (<class ‘__main__.TClassStatic‘>,))

1、普通函数,默认传入参数self,相当于C++中的this指针。解除printself中的注释,可以输出第一个参数的data就是对象的data(10)。这类函数的定义通常为def printself(self, *args, **kwargs),其特征是第一个参数为self,调用的时候只需传args,kwargs的值,实例对象.方法

2、@staticmethod修饰的函数,相当于C++中的类中静态函数,可以当做全局函数应用,默认不传入参数,调用方法:实例对象或类对象.方法

3、@classmethod修饰的函数,第一个参数cls默认是类名,调用方法:实例对象或类对象.方法

@classmethod与@staticmethod的应用实例

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class TClassStatic(object):
    obj_num = 0
    def __init__(self, data):
        self.data = data
        TClassStatic.obj_num += 1

    def printself(self):
        print("self.data: ", self.data)

    @staticmethod
    def smethod():
        print("the number of obj is : ", TClassStatic.obj_num)

    @classmethod
    def cmethod(cls):
        print("cmethod : ", cls.obj_num)
        cls.smethod()

def main():
    objA = TClassStatic(10)
    objB = TClassStatic(12)
    objB.printself()
    objA.smethod()
    objB.cmethod()
    print("------------------------------")
    TClassStatic.smethod()
    TClassStatic.cmethod()

if __name__ == "__main__":
    main()

输出结果如下:

(‘self.data: ‘, 12)
(‘the number of obj is : ‘, 2)
(‘cmethod : ‘, 2)
(‘the number of obj is : ‘, 2)
------------------------------
(‘the number of obj is : ‘, 2)
(‘cmethod : ‘, 2)
(‘the number of obj is : ‘, 2)
时间: 2024-07-30 14:54:48

python中classmethod与staticmethod的差异及应用的相关文章

Python中classmethod与staticmethod区别

classmethod:类方法staticmethod:静态方法 在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法. 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例. 普通对象方法至少需要一个self参数,代表类对象实例 类方法有类变量cls传入,从而可以用cls做一些相关的处理.并且有子类继承时,调用该类方法时,传入的类变

python类方法@classmethod与@staticmethod

目录 python类方法@classmethod与@staticmethod 一.@classmethod 介绍 语法 举例 二.@staticmethod 介绍 语法 举例 python类方法@classmethod与@staticmethod 一.@classmethod 介绍 与普通的类方法有所不同的是,用@classmethod修饰的类方法不传入self实例本身,而是传入cls,代表这个类自身,可以来调用类的属性,类的方法,实例化对象等. 语法 使用的语法也非常简单,直接在类方法上加上装

python中@classmethod @staticmethod区别

Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式. class A(object): def foo(self, x): print("executing foo(%s,%s)" % (self, x)) print('self:', self) @classmethod def class_foo(cls, x): print("executing class_foo(%s,%s)" % (cl

粗解python的@classmethod和@staticmethod及普通实例方法

引言: 使用不同的函数定义方法,可以使得函数定义更加有效而且易于维护 本文为博主原创,根据本人自己的理解整理而成,若有不准确的地方,希望能留言告知以免误导他人: 首先进一段代码,来直观感受一下不同类型的函数的定义方法: >>> >>> class A(object): a = 1 def instance_method(self): print '实例方法打印类变量a: %s' % self.a @classmethod def class_method(cls): p

python的@classmethod和@staticmethod

本文是对StackOverflow上的一篇高赞回答的不完全翻译,原文链接:meaning-of-classmethod-and-staticmethod-for-beginner Python面向对象编程中,类中定义的方法可以是@classmethod 装饰的类方法,也可以是@staticmethod 装饰的静态方法,用的最多的还是不带装饰器的实例方法.为方便,在下文中用@classmethod装饰的类方法将直接用@classmethod来表述,@staticmethod同理,望读者在阅读时自行

python中index()与find()的差异

发现了python中的index()和find()实现的功能相似,去百度发现还是有不一样的. 先来个正常的 msg = "mynameishelie"print(msg.index("m"))print(msg.find("m")) 继续 msg = "mynameishelie"print(msg.index("L"))print(msg.find("L"))

python的@classmethod和@staticmethod的区别和使用

@classmethod classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等. class A(object): bar = 1 def func1(self): print('foo') @classmethod def func2(cls): print('func2') print(cls.bar) cls().func1() # 调用 foo 方法 A.func2() #

Python的classmethod和staticmethod区别

静态方法(staticmethod) 类方法(classmethod) 静态方法和类方法都可以通过类名.方法名或者实例.方法访问. #-*- coding:utf8 -*- class A(object): def instance_method(self,x): print "instance_method (%s,%s)" % (self,x) @classmethod def class_method(cls,x): #类方法的调用使用类本身作为其隐含的参数 #调用者本身并不需要

@classmethod及@staticmethod方法浅析【python】

目前对于python中@classmethod 类方法和@staticmethod静态方法的有了一定的认识,之后有进一步的认识后继续记录. @classmethod :是和一个class类相关的方法,可以通过类货类实例进行调用,并将该class对象(不是class的实例对象)隐式地当作第一个参数传入. @staticmethod :基本上和一个全局函数差不多,可以通过类或者类的实例对象进行调用,不会隐式地传入任何参数. 区别 :类方法需要额外的类变量cls,调用类方法传入的类变量cls是子类,而