码迷,mamicode.com
首页 > 其他好文 > 详细

@staticmethod和@classmethod的作用与区别

时间:2015-08-13 06:34:15      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:python   python类方法   

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


而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。


既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看,

    - 

@staticmethod 不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

    - 

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

    - 

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。 

    - 

普通对象方法至少需要一个self参数,代表类对象实例

    - 

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像Test.foo()


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


代码示例:

#!/usr/local/python3/bin/python3

class Door(object):
    a = 1
    def __init__(self,num,status):
        self.num = num
        self.status = status
    def open(self):
        self.var = 0
        self.status = ‘open‘
    def close(self):
        self.status = ‘closed‘
    def __test(self):
        print (‘__test‘)

    @classmethod
    def test(cls):
        print("class test")
#不需要self参数,但第一个参数需要是表示自身类的cls参数。        
        print(cls.a)

    @staticmethod
    def test2():
        print("static test2")
#不需要自身对象参数,直接使用类名+类变量调用        
        print(Door.a)
        
Door.test()
d1 = Door(1,"closed")
d1.test()
#通过类名调用和通过实例调用
d2 = Door(2,"closed")
Door.test2()
d2.test2()


输出结果:

技术分享

本文出自 “突破舒适区” 博客,转载请与作者联系!

@staticmethod和@classmethod的作用与区别

标签:python   python类方法   

原文地址:http://tchuairen.blog.51cto.com/3848118/1684201

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!