当前位置: 首页 > 图灵资讯 > 行业资讯> python 成员方法的区别是什么

python 成员方法的区别是什么

发布时间:2025-09-21 14:22:11

Python的静态方法和类成员方法可以通过类或实例进行访问,两者的概念不易理清,但仍存在差异:

1)静态方法不需要引入self参数,类成员方法需要引入代表此类的cls参数;

2)从第一条开始,静态方法不能访问实例变量,类成员方法也不能访问实例变量,但可以访问类变量;

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

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

一、Python 2.3及以前,用staticmethod和classmethod类型对象包装

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

classMyClass:
val1='Value1'
def__init__(self):
self.val2='Value2'
defstaticmd():
print'无法访问val1和val2'的静态方法;
smd=staticmethod(staticmd)
defclassmd(cls):
print'类方法:'+str(cls)+',val1:'+cls.val1+',无法访问val2值'
cmd=classmethod(classmd)

执行:

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

相关推荐:Python教程

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

使用@操作符进行装饰,如下:

classMyClass:
val1='Value1'
def__init__(self):
self.val2='Value2'
@staticmethod
defstaticmd():
print'无法访问val1和val2'的静态方法;
@classmethod
defclassmd(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='Valuechanged'#改变实例变量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='ClassValuechanged'#类变量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的值无法访问

结论

若上述执行过程过于复杂,请记住以下两点:

1. 静态成员方法:不能访问类属性,实例属性,相当于一种独立的方法,可以理解与类无关,只是添加了一个功能域,如:类,有三种加密算法,可以考虑静态方法;

2. 类成员方法:可以访问类属性,但不能访问实例属性。这里需要注意的是,python是一种动态语言。与c++不同,实例可以动态添加属性,即实例属性和类属性不一定相同。

相关文章

python 成员方法的区别是什么

python 成员方法的区别是什么

2025-09-21
Python中的变量与常量

Python中的变量与常量

2025-09-19
python和c语言的区别是什么

python和c语言的区别是什么

2025-09-19
python3怎么下载

python3怎么下载

2025-09-19
python程序如何工作

python程序如何工作

2025-09-19
python pytz是什么

python pytz是什么

2025-09-19