Python的类属性和实例属性
实例属性又称为对象属性。
简而言之,类属性是类的属性,实例属性是实例的属性。类属性通过类名调用,实例属性通过self/实例对象调用。
测试代码1
# object 是 Python中的根类、最底层的类,基本上所有的类都要继承于object类
class People(object):
# 类属性
age = '123'
def __init__(self, u_name):
self.u_name = u_name
def print_student(self):
print(self.u_name, "实例属性的值:" + str(self.age))
print("类属性的值:" + str(People.age))
# 这里使用self.age实际上是绑定了一个实例属性age
def update_instance_age(self, age):
self.age = age
# 如何正确修改类属性age
@classmethod
def update_class_age(self, age):
People.age = age
# 1、类调用@classmethod装饰的方法,修改类属性age
# People.age = age
People.update_class_age(120)
print(People.age)
print("------------创建两个对象 p1 p2--------------")
p1 = People('张三')
p2 = People('李四')
# 2、通过实例对象绑定实例属性/通过调用类封装的方法绑定实例属性
# 这里的print_student()输出的是self.age,如果有同名实例属性,则调用的是同名的实例属性,否则是类属性
print("1、通过实例对象绑定:")
p1.age = 90
p1.print_student()
print("2、通过self绑定:")
p1.update_instance_age(80)
p1.print_student()
# 3、People类修改类属性age。输出p1和p2的age值,p1使用的是实例属性age/p2使用的是类属性age
print('------使用People修改name之后-------')
People.age = 88
p1.print_student()
p2.print_student()
测试代码2
下面的代码,对于我理解类属性和实例属性的区别又有了进一步的催化作用。记住以下两个结论,我觉得大概就能分清类属性和实例属性的区别了。
1、初始时如果只有类属性,self调用同名属性的时候,第一次使用时创建一个与类属性同名的实例属性,且初始值是类属性的值。
2、第二次之后的运算都与类属性无关(因为第一次已经创建了一个实例属性,使用的是当前的实例属性)
# 测试类属性和实例属性
class People(object):
# 类属性count
count = 0
def eat(self):
# 初始时如果只有类属性,self调用同名属性的时候,第一次使用时创建一个与类属性同名的实例属性,且初始值是类属性的值。
# self第二次之后的调用都与类属性无关(因为第一次已经创建了一个实例属性,使用的是当前的实例属性)
People.count += 5
self.count += 8
print(People.count, self.count)
p = People()
p.eat()
p.eat()
"""
运行结果:
>>> 5 13
>>> 10 21
"""