Python类属性实例属性区别

Python类属性与实例属性定义区别

Python 中的 类属性 是指定义在 的内部而且在方法的外部的属性,Python 中直接可以使用 “类属性名=value” 的形式来为类添加一个类属性,Python 中的类属性可以有 0 个或者多个。

Python 中的 实例属性 是指定义在类的方法的内部的属性,Python 中的实例属性可以有 0 个或者多个。

Python类属性实例属性调用区别

属性 调用方法
类属性 Python 的类属性调用方法有两种,一种是通过 “类名.属性” 的方法,另一种是通过 “对象.属性” 的方法来调用。
实例属性 Python 的实例属性只能通过 “实例.属性” 的方法来调用。

Python类属性实例属性作用域区别

属性 作用域
类属性 类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。
实例属性 实例对象的属性为实例对象自己所私有。

案例

实例属性调用

通过实例访问实例属性

print("嗨客网(www.haicoder.net)") class Student: score = 99.95 def __init__(self, name, age): print("Call init") stu = Student("HaiCoder", 18) print("Name =", stu.name, "Age =", stu.age, "Score =", stu.score)

程序运行后,控制台输出如下:

14_python类属性与实例属性.png

我们创建了一个类 Student,接着,为该类添加了一个类属性 score,和一个 __init__ 方法,其中 __init__ 方法中有三个参数。

接着,我们创建了一个 Student 类的实例,并通过实例来调用实例属性,此时程序报错,因为此时的 name 和 age 并不是实例属性,只是局部变量。

类属性是共用的

所有对象共用一个类属性

print("嗨客网(www.haicoder.net)") class Student: score = 99.95 def __init__(self, name, age): self.name = name self.age = age stu = Student("HaiCoder", 18) stu2 = Student("hacoder", 108) print("Student.score =", id(Student.score)) print("stu.score =", id(stu.score)) print("stu2.score =", id(stu2.score))

程序运行后,控制台输出如下:

15_python类属性与实例属性.png

我们创建了一个类 Student,接着,为该类添加了一个类属性 score,和两个实例属性 name 和 age。

接着,我们分别使用 “类名.属性” 的方式获取类属性的地址和两次使用不同的对象的方式获取类属性的地址,结果发现,类属性的地址都是一样的。

即,所有的对象都会共用一个类属性。

实例属性是私有的

每个对象的实例属性都是私有的

print("嗨客网(www.haicoder.net)") class Student: score = 99.95 def __init__(self, name, age): self.name = name self.age = age stu = Student("HaiCoder", 18) stu2 = Student("hacoder", 108) print("stu.name =", id(stu.name)) print("stu2.name =", id(stu2.name)) print("stu.age =", id(stu.age)) print("stu2.age =", id(stu2.age))

程序运行后,控制台输出如下:

16_python类属性实例属性.png

我们发现,每个对象的类的实例属性的地址都不一样,即每个对象的实例属性都是私有的。

Python类属性实例属性区别总结

类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,而实例对象的属性为实例对象自己所私有。