美文网首页
classmethod 和 staticmethod

classmethod 和 staticmethod

作者: bigtom | 来源:发表于2016-09-20 10:35 被阅读195次

写个例子就够了

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)  #相同

相关文章

网友评论

      本文标题:classmethod 和 staticmethod

      本文链接:https://www.haomeiwen.com/subject/mexoettx.html