classmethod 和 staticmethod

写个例子就够了

class Foo(object):
    __msg__ = "hello foo"    #类属性
    def __init__(self, ins_msg):
        self.ins_msg = ins_msg   #实例属性

    def foo(self,x):        # 实例方法(每个实例都有各自的实例方法)
        print "foo {}, {}, {}".format(x, self.__msg__, self.ins_msg) 
        # 实例方法可以使用实例属性和类属性,类属性虽然属于类,但是可以被所有实例使用

    @classmethod
    def class_foo(cls,x):      # 类方法
        print "class_foo {}, {}".format(x, cls.__msg__) # 类方法可以调用类属性

    @staticmethod    
    def static_foo(x):      # 静态方法
        print "static_foo {}".format(x)    # 不能调用类属性和实例属性

f = Foo("hello f")
#实例方法只能被对象实例调用
f.foo(1)  
#类方法和静态方法可以被对象实例或者类调用
f.class_foo(1)
Foo.class_foo(1)
f.static_foo(1)
Foo.static_foo(1)

f2 = Foo("hello f")

#事实上,在内存中,每个对象的实例方法分别存储,
#但是类方法和静态方法则是只有一份并被这个类和类的所有实例共享的
print id(f.foo), id(f2.foo)   #不同
print id(f.class_foo), id(Foo.class_foo)   #相同
print id(f.static_foo), id(Foo.static_foo)  #相同
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容