赞
赏
Python 中的 类属性 是指定义在 类 的内部而且在方法的外部的属性,Python 中直接可以使用 “类属性名=value” 的形式来为类添加一个类属性,Python 中的类属性可以有 0 个或者多个。
Python 中的 实例属性 是指定义在类的方法的内部的属性,Python 中的实例属性可以有 0 个或者多个。
属性 | 调用方法 |
---|---|
类属性 | 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)
程序运行后,控制台输出如下:
我们创建了一个类 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))
程序运行后,控制台输出如下:
我们创建了一个类 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))
程序运行后,控制台输出如下:
我们发现,每个对象的类的实例属性的地址都不一样,即每个对象的实例属性都是私有的。
类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,而实例对象的属性为实例对象自己所私有。