python 静态方法 类方法 的作用_Python 静态方法、类方法

今天我们来讨论一下Python类中所存在的特殊方法——静态方法、类方法。

一.定义

静态方法:

一种简单函数,符合以下要求:

1.嵌套在类中。

2.没有self参数。

特点:

1.类调用、实例调用,静态方法都不会接受自动的self参数。

2.会记录所有实例的信息,而不是为实例提供行为。

类方法:

一种函数,符合以下特征

1.类调用、或实例调用,传递的参数是一个类对象。

二.需要特殊方法的情况(用途)

程序需要处理与类而不是与实例相关的数据。也就是说这种数据信息通常存储在类自身上,不需要任何实例也可以处理。

例如:

1.记录有一个类创建的实例的数目。

2.维护当前内存中一个类的所有实例的列表。

以上情况也可以同以下方式解决:

在类定义之外生成一个的简单函数

例1:简单函数.py#记录一个类创建的实例的数目

def printNumInstance(): #打印出创建实例的数量

print "Number of instance created:", Spam.numInstance #调用类数据属性

classSpam:

numInstance=0def __init__(self):

Spam.numInstance= Spam.numInstance + 1 #每创建一个类,就自加一次

输出结果:

>>> a =Spam()>>> b =Spam()>>> c =Spam()>>>printNumInstance()

Number of instance created:3

>>>Spam.numInstance3

因为类名称对简单函数而言,是可读取的全局变量,所以看到上例可以正常工作。

此外,函数名变成了全局变量,故仅适用于这个单一模块。

这样处理的缺点如下:

1.给文件的作用域添加了一个额外的名称,该名称仅能处理单个的类,不能应付多个类需要处理的情况。

2.该函数与类的直接关联很小,函数的定义可能在数百行代码之外的位置。

3.该函数位于类的命名空间之外,子类不能通过重新定义来代替或扩展它。

三.实例方法、静态方法、类方法

三种方法如例2所示

例2.方法.py

#-*- coding:utf-8 -*-

classMethods:"""实例方法、静态方法、类方法"""

defimeth(self, x):printself, xdef smeth(x): #静态方法不需要self参数

printxdef cmeth(cls, x): #类方法需要一个类参数

printcls, x#要设计静态方法和类方法,如下,需调用内置函数staticmethod和clsssmethod.

smeth= staticmethod(smeth) #重新赋值方法名称,这些赋值语句会覆盖稍早由def所做的赋值

cmeth = classmethod(cmeth)

三种方法调用方式(实例调用,类调用)

1.实例方法调用

实例方法调用一定要将类实例化,方可通过实例调用。

from method import Methods #导入模块

>>> obj = Methods() #实例化

>>> obj.imeth(1) #实例调用

1 #变为imeth(obj, 1)

>>> Methods.imeth(obj, 1) #类调用

1 #变为imeth(obj, 1)实例方法调用时,Python会把实例自动传入实例方法第一个(最左侧)参数self(也可写成其他变量,但默认写成self)。

2.静态方法调用

静态方法调用时不需要实例参数。

>>> Methods.smeth(3) #类调用

3 #没有实例被传入

>>> obj.smeth(3) #实例调用

3 #实例没有传入

3.类方法调用

类方法调用时,Python会把类(不是实例)传入类方法第一个(最左侧)参数cls(默认)。

>>> Methods.cmeth(5) #类调用

method.Methods 5 #变为cmeth(Methods, 5)

>>> obj.cmeth(5) #实例调用

method.Methods 5 #变为cmeth(Methods, 5)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值