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 & ...
随机推荐
- Technical Committee Weekly Meeting 2016.06.21
Meeting time: 2016.June.21 1:00~2:00 Chairperson: Thierry Carrez Meeting summary: 1.Add current hou ...
- mysql中操作符LIKE与通配符%的使用
mysql中通配符%用来通配其他字符,操作符LIKE用来查询字段中存在相同的字符 SELECT t.userId,t.cellphone,t.idNo,t.* FROM t_person t WHER ...
- Day3 Form表单
Day3 Form表单 一.form表单 :提交数据 表单在网页中主要负责数据采集功能,它用<form>标签定义. 用户输入的信息都要包含在form标签中,点击提交后,< ...
- 从零开始的全栈工程师——js篇2.19(BOM)
一.BOM 浏览器对象模型 1.window.open(url,ways) url 是打开的网页地址ways 打开的方式 _self 2.window.close() 关闭当前页面 3.window. ...
- 超链接导致window.location.href失效的解决办法
通常我们采用 window.location.href 执行页面间的跳转,比如下面的语句 window.location.href = 'https://www.baidu.com/'; 一般执行上面 ...
- 安装BI Publisher Desktop报错:“Template Builder Installer Failed:Unexpected Error”
原因:office的版本未安装正确,应该安装X86版本的,如果是X64的会出现,重新安装X86版本的office后解决问题.
- springboot利用mail配置包,实现邮件发送
了解邮件发送与接收的过程: A->S1->S2->B 1.计算机A通过SMTP协议将邮件发送到服务器S1上: 2.服务器S1再发送到服务器S2: 3.计算机B通过POP3协议接收服务 ...
- Struts2_BBS2009小实战
Struts2_BBS2009准备:链接: http://pan.baidu.com/s/1nvTZz9R 密码: 875a ext3.0_直接部署运行:链接: http://pan.baidu.co ...
- python标准库 - socket
地址簇(address family) socket.AF_UNIX # (UNIX Domain Sockets) socket.AF_INET # ipv4 socket.AF_INET6 # i ...
- js&jquery:添加事件的三种方法和常用的一些事件
一.添加事件的方法 1.EventTarget.addEventListener添加 获取事件目标元素,通过addEventListener函数添加 // Assuming myButton is a ...