最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Python的静态方法和类成员方法

来源:动视网 责编:小采 时间:2020-11-27 14:27:43
文档

Python的静态方法和类成员方法

Python的静态方法和类成员方法:Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;(参数cls代表本类)2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例
推荐度:
导读Python的静态方法和类成员方法:Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;(参数cls代表本类)2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例


Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:

1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;(参数cls代表本类)

2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;

3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。

实现静态方法和类方法的两种方式

一、在Python 2.3及之前,用staticmethod和classmethod类型对象包装实现

例子如下(注意print里的说明):

class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
def staticmd():
print '静态方法,无法访问val1和val2'
smd = staticmethod(staticmd)

def classmd(cls):
print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'
cmd = classmethod(classmd)

执行:

>>> mc = MyClass()
>>> mc.smd()
>>> mc.cmd()
>>> MyClass.smd()
>>> MyClass.cmd()

二、在Python 2.4及之后,用装饰器(decorators)实现

装饰器使用@操作符,例子如下:

class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'

@staticmethod
def staticmd():
print '静态方法,无法访问val1和val2'

@classmethod
def classmd(cls):
print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'

不管是以上两种方式中的哪一种,执行情况都是一样的,以方式二执行结果为例分析如下:

执行:

>>> mc = MyClass() # 实例化


>>> mc.staticmd() # 实例调用静态方法,无法访问实例变量val1和val2

>>>
静态方法,无法访问val1和val2

>>> mc.classmd() # 实例调用类方法,注意,这里访问的是类MyClass的变量val1的值,不是实例化后mc的实例变量val1,这里容易混淆,往下看就会明白。val2一直是实例变量,所以无法访问

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.staticmd() # 类直接调用静态方法,结果同上面的实例调用,无论是类变量还是实例变量都无法访问

>>>
静态方法,无法访问val1和val2

>>> MyClass.classmd() # 类直接调用类方法,结果同上面的实例调用

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> mc.val1 = 'Value changed' # 改变实例变量val1的值

>>> mc.classmd() # 实例调用类方法,注意到cls.val1的值没变,所以,这时的cls.val1是类变量val1,而非实例变量val1

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值


>>> MyClass.classmd() # 类直接调用类方法,结果同上面的实例调用

>>>

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

>>> MyClass.val1 = 'Class Value changed' # 改变类变量val1的值


>>> mc.classmd() # 实例调用类方法,注意到cls.val1的值变了,所以,进一步证明了这时的cls.val1是类变量val1,而非实例变量val1

>>>

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

>>> MyClass.classmd() # 类直接调用类方法,结果同上面的实例调用

>>>

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

结论

如果上述执行过程太复杂,记住以下两点就好了:

静态方法:无法访问类属性、实例属性,相当于一个相对的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已。

类成员方法:可以访问类属性,无法访问实例属性。上述的变量val1,在类里是类变量,在实例中又是实例变量,所以容易混淆。

文档

Python的静态方法和类成员方法

Python的静态方法和类成员方法:Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;(参数cls代表本类)2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例
推荐度:
标签: 方法 的方法 函数
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top