Python的静态方法和类方法
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的静态方法和类方法的更多相关文章
- Python面向对象静态方法,类方法,属性方法
Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...
- python中静态方法、类方法、属性方法区别
在python中,静态方法.类方法.属性方法,刚接触对于它们之间的区别确实让人疑惑. 类方法(@classmethod) 是一个函数修饰符,表是该函数是一个类方法 类方法第一个参数是cls,而实例方法 ...
- Python:静态方法、类方法、实例方法
1. 静态方法@staticmethod (1)无需自身对象的self参数和自身类的cls参数,可直接通过 类名.方法名 进行调用 (2)Python中并不是真正意义上的静态方法,因为类定义本身就是个 ...
- python 面向对象静态方法、类方法、属性方法、类的特殊成员方法
静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. 在类中方法定义前添加@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用 ...
- 透过代码理解python的静态方法、类方法与实例方法
话不多说,直接上程序: a = 111 class A(object): a = 1 def f_instance(self): print self.a @staticmetho ...
- python 静态方法、类方法(二)
<Python静态方法.类方法>一文中曾用在类之外生成函数的方式,来计算类的实例的个数.本文将探讨用静态方法和类方法来实现此功能. 一使用静态方法统计实例 例1.static.py # - ...
- Python 静态方法、类方法
今天我们来讨论一下Python类中所存在的特殊方法--静态方法.类方法. 一.定义 静态方法: 一种简单函数,符合以下要求: 1.嵌套在类中. 2.没有self参数. 特点: 1.类调用.实例调用,静 ...
- python中的函数调用绑定,静态方法和类方法
在C++的类中,有两种函数:普通成员函数和静态成员函数,差别是成员函数通过类实例调用,而静态成员函数通过类名调用.本质上,成员函数在调用的时候会默认把this指针作为第一个参数传入,而静态成员函数不需 ...
- python中的静态方法和类方法
在python中,各种方法的定义如下所示: class MyClass(object): #在类中定义普通方法,在定义普通方法的时候,必须添加self def foo(self,x): print & ...
随机推荐
- MySQL(四)
一.使用正则表达式查询 SELECT * FROM employee WHERE name REGEXP '^ale'; SELECT * FROM employee WHERE name REGEX ...
- js获取文件上传进度
js获取文件上传进度: <input name="file" id="FileUpload" type="file" /> &l ...
- input输入框不能获得焦点
今天在ipad上遇到一个问题:jquery 调用 $(id).focus() 方法,失效,不能弹出键盘获得输入的焦点. 开始以为是 $(id).focus() 方法的问题,然后就试着用原声的docum ...
- 详解HTML中的表单元素
代码详讲: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- python异常处理、断言
异常处理基本语法 捕获异常 try: 语句1 语句2 ... except ERRNAME as e: print(e) #尝试执行语句,捕获到ERRNAME异常时打印异常信息e 捕获多个异常 try ...
- Row_number() OVER(PARTITION BY xxx ORDER BY XXX)分组排序
--//创建一个信息表 ,) ,),st_name ),class ),score ,)) --//插入测试数据============start=================== insert ...
- Linq to Sql 左连接 , 取右表可能为 null的 int类型字段
linq to sql , linq to entity 遇到一个问题, 主表, 从表 一对一 关系, 主表有记录, 从表 可能没有记录. 现在要查询 主表+从表 的某几个字段. 从表字段 有的是 ...
- 学习lucene5.5.4的笔记
说说几个常用的类. OpenMode是一个枚举类,有三个元素,分别表示IndexWriter的打开模式. CREATE:每次打开IndexWriter时清空当前索引目录下的索引,再新建索引. APPE ...
- Centos 6/RHEL disable the IPv6 module.
http://minimallinux.blogspot.com/2013/07/centos-6rhel-disable-ipv6-module.html IPv6 was introduced t ...
- 01、Spark安装与配置
01.Spark安装与配置 1.hadoop回顾 Hadoop是分布式计算引擎,含有四大模块,common.hdfs.mapreduce和yarn. 2.并发和并行 并发通常指针对单个节点的应对多个请 ...