参考:《Python 3 面向对象编程(第2版)》第3章 对象相似时,该书基于python 3.4。
该书实际将python类声明中定义的变量分为了类变量、对象(或实例)变量和函数方法内部的局部变量。
1、函数方法内部的局部变量
与普通函数定义的局部变量并没有什么不同,其作用域通常在函数运行期间内,随着函数运行结束,如果不存在外部引用的话,则局部变量自动消逝。
2、对象(实例)变量
通常可见于类的初始化函数__init__之中。比如:我们声明一个联系人的类。
class Contact:
def __init__(self, name, email):
self.name = name
self.email
那么,类实例化之后,则name和email将成为实例化对象的“属性”变量。
3、类变量
在类声明中,直接定义在class 类名下面一级的变量,就叫类变量。
class Contact:
all_contacts = []
def __init__(self, name, email):
self.name = name
self.email
Contact.all_contacts.append(self)
以上代码中,all_contacts即为Contact类的类变量,其实就是今天想说的静态变量,此静态变量既可以通过类名进行访问(Contact.all_contacts),也可以通过实例化对象进行访问,但无论哪一种方式,访问的都是同一个变量。下面,我们利用内置函数id()确认一下:
classContact:
all_contacts=[]
def__init__(self,name,email) ->None:
self.name=name
self.email=email
Contact.all_contacts.append(self)
pass
if__name__=='__main__':
c=Contact('张三','zhangsan@abc.com')
d=Contact('李四','lisi@163.com')
print('c.all_contacts == d.all_contacts',c.all_contacts==d.all_contacts)
print('Contact.all_contacts == d.all_contacts',Contact.all_contacts==d.all_contacts)
print('id(c.all_contacts)',id(c.all_contacts))
print('id(d.all_contacts)',id(d.all_contacts))
print('id(Contact.all_contacts)',id(Contact.all_contacts))
forcontactinc.all_contacts:
print(contact.name,' -- ',contact.email)
将以上代码保存为当前目录的test.py中,然后在命令行执行python test.py。
运行结果
确定,一定,以及肯定是一致的。所以,是不是可以相当于其他语言中的类的静态变量(属性)了?