python类里面的实例方法我是很常用的,这个类方法和静态方法不怎么常用。所以有必要记录一下:
静态方法,使用@staticmethod修饰;
类方法,使用@classmethod修饰。
实例方法
定义:第一个参数必须是实例对象,参数名约定为“self”(当然,这个是可以改变的,但还是要self好点),通过它来传递实例的属性和方法(也可以传类的属性和方法);
调用:在类外部,原则上由实例对象调用。
类方法
定义:使用装饰器@classmethod。第一个参数必须是当前类对象,参数名约定为“cls”,通过它来传递类的属性和方法,原则上不传实例的属性和方法【但想传也是可以的】;
调用:实例对象和类对象都可以调用。
静态方法
定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,原则上静态方法体中不使用类或实例的任何属性和方法,但本质上是可以调用的;
调用:实例对象和类对象都可以调用。
至于以上为什么要加个原则上,因为python不是java,没有java那么安全的类对象管理机制,也可以说成python的类对象机制比较的开放吧。下面这个例子是一个很好的诠释:
当然,最好遵守上面的那些原则上的原则。
class Foo:
classname = "Foo"
def __init__(self,name):
self.name = name
def f1(self):
print(self.name)
@staticmethod
def f2():
print("static and",Foo.classname)
@classmethod
def f3(cls):
cls.f1(f)
print(cls.classname)
if __name__ == '__main__':
f = Foo("李")
f.f1()
f.f2()
f.f3()
print("----------")
Foo.f1(f)
Foo.f2()
Foo.f3()