- python 类语法中有三种方法,实例方法,静态方法,类方法。
普通实例方法,第一个参数需要是self,它表示一个具体的实例本身。
如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。
而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身。
实例方法,第一个参数必须要默认传实例对象,一般习惯用self。必须要实例化。
静态方法,参数没有要求。可以实例化也可以不实例化。
类方法,第一个参数必须要默认传类,一般习惯用cls。可以实例化也可以不实例化。
# -*- coding: utf-8 -*-
"""
Created on Sat May 25 19:42:21 2019
@author: dongyang
"""
# coding:utf-8
class A(object):
"""类三种方法语法形式"""
def instance_method(self):
print("是类{}的实例方法,只能被实例对象调用".format(A))
@staticmethod
def static_method():
print("是静态方法")
@classmethod
def class_method(cls):
print("是类方法")
B= A()
B.instance_method()
B.static_method()
B.class_method()
print('----------------')
A.static_method()
A.class_method()
结果:
是类<class '__main__.A'>的实例方法,只能被实例对象调用
是静态方法
是类方法
----------------
是静态方法
是类方法
2.类⽅法的用途
类⽅法⼀个⽤途就是可以对类属性进⾏修改,在⽤类⽅法对类属性修改之后,通过类对象和实例对象访问都发⽣了改变。
类⽅法的第⼀个参数是类对象cls,那么通过cls引⽤的必定是类对象的属性和⽅法;⽽实例⽅法的第⼀个参数是实例对象self,那么通过self引⽤的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更⾼。静态⽅法中不需要额外定义参数,因此在静态⽅法中引⽤类属性的话,必须通过类对象来引⽤。
# -*- coding: utf-8 -*-
"""
Created on Sat May 25 19:59:31 2019
"""
class People(object):
country = 'china'
@classmethod
def getCountry(cls):
return cls.country
@classmethod
def setCountry(cls,country):
cls.country = country
p = People()
print(p.getCountry()) #可以⽤过实例对象引⽤
print(People.getCountry()) #可以通过类对象引⽤
p.setCountry('japan')
print(p.getCountry())
print(People.getCountry())
结果:
china
china
japan
japan
3.静态⽅法
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。
4.区别
Staticmethod 无法访问类属性,实例属性
Classmthod 可以访问类属性,无法访问实例属性