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 & ...
随机推荐
- mac os安装macvim
1 brew install macvim 安装 macvim 2 alias vim='/usr/local/Cellar/macvim/7.4-73_1/MacVim.app/Contents/M ...
- 【密码学】CSP的概念
CSP加密服务提供者(Cryptographic Service Provider)具有一下几个特点: CSP是真正执行密码运算的独立模块 物理上一个CSP由两部分组成:一个动态连接库,一个签名文件 ...
- rsync 命令中的路径斜线
rsync命令大家都知道,但是其中的一个小细节比较容易被忽略,那就是 路径结尾的 "/" ,在路径的结尾有没有斜线,结果是大不同的.现举例说明: 假设现有两个目录,一个名为sour ...
- pat1016. Phone Bills (25)
1016. Phone Bills (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A long-di ...
- windows下curl的安装和简单使用
curl是利用URL语法在命令行方式下工作的开源文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP. 一 ...
- 基于JQUERY 的图片查看插件
viewer是一款功能强大的图片查看器.它可以实现ACDsee等看图软件的部分功能.它可以对图片进行移动,缩放,旋转,翻转,可以前后浏览一组图片.该图片查看器还支持移动设备,支持键盘控制,功能十分强大 ...
- Java基于jdbc链接mysql数据库步骤示列
用JDBC来链接MYSQL数据库,基本步骤都大同小异,只不过不同的数据库之间的URL地址有些不同.其基本步骤可分为以下几点: 1.加载相应的数据库的JDBC驱动程序. 2.利用驱动管理器DriverM ...
- oracle基本查询练习
select * from regions; select * from countries; select * from locations; select * from departments; ...
- Linux,MD5
Linux 中的 md5 利用 md5 消息摘要算法可以获取任何一件事物的唯一 ID 利用 md5 消息摘要算法可以判断任何一个事物是否被改变过 一致性验证:MD5的典型应用是对一段信息(Messag ...
- html5 chrome 摄像头 &&bootstrap
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...