类方法和静态方法
类方法
是类本身所拥有的方法,需要用修饰器 @classmethod 来标识其为类方法,对于类方法,一般以cls作为第一个参数,能够通过实例对象和类本身去访问
① 类方法引用
# coding:utf-8
class People():
# 类属性
addr = "wuxi"
# 类方法
@classmethod
def get_addr(cls):
return cls.addr
p = People()
print(p.get_addr()) # 实例对象引用类方法
print(People.get_addr()) # 类对象引用类方法
② 类方法修改类属性
# coding:utf-8
class People():
# 类属性
addr = "wuxi"
# 类方法
@classmethod
def get_addr(cls):
return cls.addr
@classmethod
def set_addr(cls, addr):
cls.addr = addr
People.set_addr("beijing")
print(People.addr) # 结果为:beijing
静态方法
需要通过修饰器 @staticmethod 来进行修饰,静态方法不需要定义参数,没有self,通过类本身调用或者通过实例对象来调用
# coding:utf-8
class People():
# 类属性
addr = "wuxi"
# 静态方法
@staticmethod
def get_addr():
return People.addr
print(People.get_addr()) # 类对象直接调用
print(People().get_addr()) # 实例对象直接调用
总结:
self参数的为实例方法,cls参数的为类方法 @classmethod修饰,啥都没有的为静态方法@staticmethod修饰
(1)类方法的第一个参数是类对象cls,通过cls引用的必定是类本身的属性和方法
(2)实例方法的第一个参数是实例对象self,通过self引用的可能是类属性、也有可能是实例属性。(存在相同名称的类属性和实例属性的情况下,实例属性优先级更高)
(3)静态方法不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类本身来引用
代码部分:
class A():
addr = "wuxi"
def __init__(self,name,age):
self.name = name
self.age = age
def example_func(self):
"""实例方法"""
return self.name,self.age
@classmethod
def cls_func(cls,addr):
"""类方法"""
cls.addr = addr
return cls.addr
@staticmethod
def static_func(a,b):
"""静态方法"""
return a+b
a = A("suner",20)
print("实例对象a调用实例方法:", a.example_func())
print("实例对象a调用类方法:", a.cls_func("shanghai"))
print("实例对象a调用类方法:", a.static_func(10,20))
print("类本身调用类方法:", A.cls_func("beijing"))
print("类本身调用静态方法:", A.static_func(10,20))
执行结果: