类方法是对类中定义的函数的称呼,有别于一般函数的是,它的第一个参数是固定的,表示类实例化后实例本身。
为什么类方法的第一个参数必须为指代实例本身的参数?
这里要介绍一下类中的变量类型
类中的变量有两种类型:类变量 和 实例变量
类变量:
在类方法外,命名方式和普通变量一样,在类方法内使用 “类.变量” 的方式表示。
实例变量:
带有 “self” 前缀的即为 实例变量 。因为它要带有 “self” 前缀,所以它必定位于类方法内。
实例变量 是类实例化后拥有的变量,适用范围只限于一个实例内,多个实例不共享。
类变量 的使用不需要类实例化,且类实例化后,多个实例共享类变量。
先看类变量 的使用不需要类实例化
定义,__init__函数是内置方法,效果是运行类后自动运行其函数,不用像别的函数那样 显式调用
显示调用:若要使用A中foo的方法必须a.foo(),其中a.foo()为显示调用
class A(object):
class_var = 0
def __init__(self):
A.class_var += 1
def foo(self):
print("Axxx.class_var is {}".format(id(A.class_var)))
print("self.class_var is {}".format(id(self.class_var)))
def bar(self):
print("Total is {}".format(A.class_var))
print("self is {}".format(self.class_var))
a=A()
运行
A
a.bar()
结果是
Total is 1
self is 1
可以看到 类变量 使用不需要类实例化,并且被实例化后的实例共享
类变量 在与 实例变量 值不同前,其id与 实例变量 保持一致,即共享同一个存储单元
运行
a.foo()
结果
Axxx.class_var is 140726138671968
self.class_var is 140726138671968
再次验证
class A(object):
class_var = 0
def __init__(self):
A.class_var += 1
self.class_var += 1
def foo(self):
print("Axxx.class_var is {}".format(id(A.class_var)))
print("self.class_var is {}".format(id(self.class_var)))
def bar(self):
print("Total is {}".format(A.class_var))
print("self is {}".format(self.class_var))
a=A()
a.foo()
a.bar()
Axxx.class_var is 140726138671936
self.class_var is 140726138671968
Total is 1
self is 2
实例变量 值被加了两次,然后我们调换A.class_var += 1 和 self.class_var += 1 位置
class A(object):
class_var = 0
def __init__(self):
self.class_var += 1
A.class_var += 1
def foo(self):
print("Axxx.class_var is {}".format(id(A.class_var)))
print("self.class_var is {}".format(id(self.class_var)))
def bar(self):
print("Total is {}".format(A.class_var))
print("self is {}".format(self.class_var))
a=A()
a.foo()
a.bar()
结果是
Axxx.class_var is 140726138671936
self.class_var is 140726138671936
Total is 1
self is 1
实例变量 值被加了一次,与类变量 的值保持不变,所以它们的id也相同。