Python中使用@staticmethod这个装饰器让方法变为静态方法

一:定义

@staticmethod: 首先它是一个装饰器,被装饰的方法不需要隐含的参数,对象和对象的实例都可以调用静态方法

类方法是通过@classmethod进行装饰,被装饰的方法第一个隐含参数是cls,同样对象和对象的实例都可以调用类方法

这里还有一个叫实例方法,实例方法就是实例的方法,它是与实例进行绑定的,只能实例进行调用,第一个隐含参数是self

二:举例说明

翻译自:https://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-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()

1.下面是实例方法调用函数吗,实例a被隐式传递做为第一个参数,即self

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)

2.当调用类方法时,实例的类就被隐式传递给函数作为第一个参数,即cls

a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

你当然也可以使用类调用class.foo,实际上你如果想定义某个函数为类函数,那是因为多半想使用类进行访问而不是实例,A.foo(1)会

抛出TypeError(实例方法不能类进行调用),但是A.class_foo(1)却可以正常调用

A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

还有一个用法:类方法可以被用来创建可继承的动态构造器

3.在使用staticmethods时,不需要隐含的第一个函数,静态函数的行为除了可以类方法和实例方法进行访问外,和普通方法没有什么区别

a.static_foo(1)
# executing static_foo(1) A.static_foo('hi')
# executing static_foo(hi)

foo只是一个函数,但是当你使用a.foo时你并不是获取函数,你获取的是“”第一个参数绑定到实例对象a的部分实现的函数版本“”,foo函数需要连个参数,

但是a.foo只需要一个参数,a绑定到foo函数,这就是下面这个“bound”的意思

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

类似的,对于类方法,类绑定到foo函数的

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

那么对于静态函数,就没有绑定的对象

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

三:类函数可以用于多态

class method绑定到类,而且被子类继承,子类调用的时候传入实际调用时的子类型,可以用这个子类型调用其他class method,
这样就可以在子类型中override某些class method实现多态。static方法一般是不存在override的,它调用的时候没有绑定到具体的参数,所以也不能靠自己实现多态。

>>> class DictSubclass(dict):
... def __repr__(self):
... return "DictSubclass"
...
>>> dict.fromkeys("abc")
{'a': None, 'c': None, 'b': None}
>>> DictSubclass.fromkeys("abc")
DictSubclass
>>>

Python的静态方法和类方法的更多相关文章

  1. Python面向对象静态方法,类方法,属性方法

    Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...

  2. python中静态方法、类方法、属性方法区别

    在python中,静态方法.类方法.属性方法,刚接触对于它们之间的区别确实让人疑惑. 类方法(@classmethod) 是一个函数修饰符,表是该函数是一个类方法 类方法第一个参数是cls,而实例方法 ...

  3. Python:静态方法、类方法、实例方法

    1. 静态方法@staticmethod (1)无需自身对象的self参数和自身类的cls参数,可直接通过 类名.方法名 进行调用 (2)Python中并不是真正意义上的静态方法,因为类定义本身就是个 ...

  4. python 面向对象静态方法、类方法、属性方法、类的特殊成员方法

    静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. 在类中方法定义前添加@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用 ...

  5. 透过代码理解python的静态方法、类方法与实例方法

    话不多说,直接上程序: a = 111 class A(object):   a = 1   def f_instance(self):     print self.a   @staticmetho ...

  6. python 静态方法、类方法(二)

    <Python静态方法.类方法>一文中曾用在类之外生成函数的方式,来计算类的实例的个数.本文将探讨用静态方法和类方法来实现此功能. 一使用静态方法统计实例 例1.static.py # - ...

  7. Python 静态方法、类方法

    今天我们来讨论一下Python类中所存在的特殊方法--静态方法.类方法. 一.定义 静态方法: 一种简单函数,符合以下要求: 1.嵌套在类中. 2.没有self参数. 特点: 1.类调用.实例调用,静 ...

  8. python中的函数调用绑定,静态方法和类方法

    在C++的类中,有两种函数:普通成员函数和静态成员函数,差别是成员函数通过类实例调用,而静态成员函数通过类名调用.本质上,成员函数在调用的时候会默认把this指针作为第一个参数传入,而静态成员函数不需 ...

  9. python中的静态方法和类方法

    在python中,各种方法的定义如下所示: class MyClass(object): #在类中定义普通方法,在定义普通方法的时候,必须添加self def foo(self,x): print & ...

随机推荐

  1. [转]jQuery.getJSON的缓存问题的解决办法

    本文转自:http://mfan.iteye.com/blog/974132 今天做测试工作,发现了一个令我费解的问题,jquery的getJson方法在firefox上运行可以得到返回的结果,但是在 ...

  2. [转]理解js中的原型链,prototype与__proto__的关系

    本文转自:http://rockyuse.iteye.com/blog/1426510 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script typ ...

  3. AJAX重点知识的心得体会

    下面就为大家带来一篇 AJAX重点知识的心得体会.学习还是有点帮助的,给大家做个参考吧. AJAX是什么? 是Asynchronous Javascript And XML的首字母的缩写, 它不是一门 ...

  4. angularjs ui-grid如何动态设置行高

    自己开发的公众号,可以领取淘宝内部优惠券 在用ui-grid的时候我们可以用rowHeight设置行高,可是每一行的高度都是一样的,无法根据行内的内容进行自适应.如下图 为了解决这个问题,google ...

  5. JAVA避免入坑必备

    1.关于@Override Annocation 对于子类(包括并且特别是匿名类)中,重写父类的函数,一定要加上@Override.这会帮助你避免很多不必要的看起来让人恼怒的错误.比如,为什么子类重写 ...

  6. 粗看ES6之字符串

    标签: javascript es6 字符串新增特性 新增二个方法 - startsWith/endsWith 字符串模板 - 反单引号的应用 startsWith 判断字符串以是否以某某开头,返回一 ...

  7. 从零开始的全栈工程师——js篇(作用域 this 原型笔试题练习)

    作用域 // 1. fn() function fn () { console.log(12) } var as = function () { console.log(45) } // 2. var ...

  8. The fourteenth day

    A man is not old as long as he is seeking something. A man is not old until regrets take the place o ...

  9. The tenth day

    Why the long face? 你为什么不高兴,你为什么扳着脸,愁眉苦脸. Why the long face? Are you feeling down again? 你脸怎么这么臭,你又心情 ...

  10. [bootstrap]模态框总结

    <!--data-backdrop禁止点击空白处关闭模态框,也可以js设置,其他参数可参考官网模态框文档--> <div class="modal fade" i ...