Python中静态方法和类方法的区别

Python023

Python中静态方法和类方法的区别,第1张

一、先是在语法上面的区别:

1、静态方法不需要传入self参数,类成员方法需要传入代表本类的cls参数;

2、静态方法是无妨访问实例变量和类变量的,类成员方法无法访问实例变量但是可以访问类变量

二、使用的区别:

由于静态方法无法访问类属性,实例属性,相当于一个相对独立的方法,跟类其实并没有什么关系。这样说来,静态方法就是在类的作用域里的函数而已。

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

1)静态方法无需传入self参数,类成员方法需传入代表本类的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的值'

最近写项目遇到一个类调用另一个类的方法,下面用A类和B类表示。

如果B类成员要用到A类成员的一个方法时,当然,我们可以直接传入A类成员至B,但如果A类成员过大(例如A类为数据集处理类)会导致内存不必要的损失。其实可以直接传入A类方法至B类:

在这里,为B类成员写一个专门获取外界方法的接口 getFunction ,这样做可以使类的使用更加灵活,你可以自定义想导入的变量,方法等。