假如程序如下:
class AAA():
name='没有'
age=0
def __init__(self,name='Tom',age=10):
self.name=name
self.age=age
def aa(self):
print(self.name,self.age)
@classmethod #注意这里有修饰
def bb(cls):
print(cls.name,cls.age)
@staticmethod #注意这是有修饰
def cc():
print("这是static修饰方法")
print(AAA.name,AAA.age)
def dd(sel): #注意这是第一参数不是self
print(sel.name,sel.age)
实例化两个变量a和b
b=AAA('张三',20) #传递两个参数过去
a=AAA() #不传参数使用默认值
1、执行如下:
b.aa()
a.aa()
结果:
张三 20 #b 实例化时传递了此两个参数,所有结果正确
Tom 10 #a 实例化时没有传递参数,所有使用了初始值 结果正确
2、执行如下
#注意类方法bb()是用@classmethod修饰的
b.bb() #用实例b调用类方法bb()
AAA.bb() #用类名直接调用类方法bb()
a.bb() #用实例a调用类方法bb()
结果是:
没有 0
没有 0
没有 0
无论是用实例调用 还是用类名调用类方法,返回的都是类成员变量值。
3、执行如下
a.dd() #用实例a调用普通方法dd()
b.dd() #用实例b调用普通方法dd()
结果是:
Tom 10
张三 20
各实例的值成员变量值 没有变
总结:这个实验证明一点,类中的方法如果 加了@classmethod修饰后,无论使用什么方式调用该方法取成员变量值,返回的都是类自身的成员变量值 ,不会返回实例成员变量值