深入理解类属性与实例属性:Python面向对象编程中的关键概念
类属性

类属性是在类定义里声明的属性,它与类本身相关联。类属性一般在类定义的顶部进行声明,在类的所有实例间是共享的。能够通过类名去访问类属性,也可以通过类的实例来访问。当某一个实例试图访问一个类属性时,倘若该实例没有同名的实例属性,就会返回该类属性的值。
让我们来看一个示例:
class Circle:
pi = 3.14
def __init__(self, radius):
self.radius = radius
circle1 = Circle(5)
circle2 = Circle(10)
print(circle1.pi) # 输出:3.14
print(circle2.pi) # 输出:3.14
print(Circle.pi) # 输出:3.14
在上述示例里,我们定义了一个称作 Circle 的类,且在类的顶端声明了一个类属性 pi 。接着我们创建了两个 Circle 的实例,分别是 circle1 和 circle2 ,然后访问了它们的 pi 属性。因为这些实例没有与之同名的实例属性,所以它们都呈现出类属性 pi 的值。
实例属性
init()方法会为该实例初始化属性。
让我们来看一个示例:
class Student:
初始化自身,传入姓名和年龄这两个参数。 其中一个参数名为 name,另一个参数名为 age。 此方法用于创建对象并进行相关初始化操作。 它会根据传入的姓名和年龄来设置对象的相应属性。 这样在后续使用对象时,可以通过这些属性来获取和操作相关信息。
self.name = name
self.age = age
创建了一个名为 student1 的对象,该对象是 Student 类的实例,其名字为 "Alice",年龄为 20 。
student2 = Student("Bob", 25)
输出学生 1 的名字,即输出:Alice
print(student1.age) # 输出:20
输出学生 2 的名字,即 Bob。具体为打印 student2 的 name 属性,其结果为 Bob。
print(student2.age) # 输出:25
在上述示例里,我们定义了一个类叫 Student ,接着在 init() 方法里把实例属性 name 和 age 进行了初始化。我们构建了两个 Student 的实例,分别是 student1 和 student2 ,并且分别对它们的 name 属性和 age 属性进行了访问。
init()内外的变量差异
类属性既可以通过类名访问,也可以通过实例访问。
让我们来看一个示例,进一步说明这个差异:
class Car:
color = "red"
def __init__(self, brand):
self.brand = brand
def get_color(self):
return self.color
定义一个方法 set_color,该方法接收一个参数 new_color
self.color = new_color
car1 = Car("Toyota")
输出 car1 获取到的颜色,结果为 red 。
car2 = Car("BMW")
car2.set_color("blue")
输出汽车 car2 的颜色,结果为 blue 。具体来说,通过调用 car2 的 get_color() 方法,获取到了其颜色信息,该信息为 blue 。
print(car1.get_color()) # 输出:red
在上述示例里,我们定义了一个称作 Car 的类,且在类定义的最上方声明了一个类属性为 color。在 init()方法的内部,我们定义了一个实例属性是 brand。我们构建了两个 Car 的实例,分别是 car1 和 car2,并且分别对它们的 color 属性进行了访问。
调用 car2 的 set_color()方法后,我们将 car2 的 color 属性值修改为“blue”。然而,car1 的 color 属性依旧保持着原来的“red”值。因为 color 属于类属性,当我们借助 car2 去访问 color 属性时,会在实例层面创建一个名为 color 的新的实例属性,接着把它赋值为“blue”。并且不会对类属性 color 的值进行修改。
总结
在 Python 中,类属性是和类本身相联系的属性,能够通过类名或者实例去进行访问。并且实例属性是与类的实例相关联的属性,仅能通过实例来访问。init()方法属于特殊的方法,其作用是在创建类的实例的时候对对象的属性进行初始化。在 init()方法内部所定义的变量是实例属性,然而在 init()方法外部定义的变量则是类属性。了解类属性与实例属性存在差异,这对于正确运用 Python 类和实例而言是很重要的。