1. 静态方法
静态方法是类中的函数,不需要实例。
静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。
class People:
defaultName = 'DefaultName'
def __init__(self, name):
self.name = name
def eat(self, food):
print('%s is eating %s' % (self.name, food))
@staticmethod # 使用 @staticmethod 作为装饰器的方法就是静态方法
def play(obj): # 参数不用 self ;
print('%s is playing %s' % (People.defaultName,obj)) # 不能引用或访问实例属性;可以通过类.类变量访问类属性
man1 = People('Tom')
man1.eat('apple')
man1.play('football') # 用实例调用
People.play('basketball') # 用类调用
返回:
Tom is eating apple
DefaultName is playing football
DefaultName is playing basketball
本质:
- 在类中的一个普通函数而已
- 使面向对象程序中函数归属于类,易于代码管理
2. 类方法
类方法是将类本身作为对象进行操作的方法。
他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来。
class Test:
@classmethod
def class_method(cls):
print('This is {0}'.format(cls))
class SubTest(Test):
@classmethod # 使用 @classmethod 作为装饰器的方法就是类方法
def subclass_method(cls): # 必须提供参数cls; 不能引用或访问实例属性
print('This is {0}'.format(cls))
if __name__ == '__main__':
a = Test()
a.class_method() # 可以用类、类实例调用
Test.class_method() # 可以用类、类实例调用
print('+======================================================+')
b = SubTest()
b.subclass_method()
b.class_method() # 继承时,传入的类变量cls是子类,而非父类
SubTest.subclass_method()
SubTest.class_method() # 继承时,传入的类变量cls是子类,而非父类
This is <class ‘main.Test’>
This is <class ‘main.Test’>
+======================================================+
This is <class ‘main.SubTest’>
This is <class ‘main.SubTest’>
This is <class ‘main.SubTest’>
This is <class ‘main.SubTest’>
用途:
1.与类相关,但不依赖或改变类的实例
2.工厂方法,创建类实例,完成有关预处理
3.在类内调用静态方法时不用硬编码类名