Python - 类属性

大家好,有抱负的程序员们!今天,我们将深入探讨Python类属性的激动人心的世界。如果你是编程新手,不用担心;我会一步一步引导你完成这次旅程,就像我多年来对我的学生所做的那样。那么,让我们开始吧!

Python - Class Attributes

类属性(变量)

类属性是属于整个类而不是类的特定实例的变量。可以将它们视为该类所有对象共享的特性。

让我们从一个简单的例子开始:

class Dog:
species = "Canis familiaris"

def __init__(self, name, age):
self.name = name
self.age = age

fluffy = Dog("Fluffy", 3)
buddy = Dog("Buddy", 5)

print(Dog.species)  # 输出: Canis familiaris
print(fluffy.species)  # 输出: Canis familiaris
print(buddy.species)  # 输出: Canis familiaris

在这个例子中,species 是一个类属性。它直接定义在类内部,但不在任何方法内部。所有的 Dog 对象都共享这个属性。

访问类属性

正如上面的例子所示,您可以通过以下两种方式访问类属性:

  1. 通过类本身:Dog.species
  2. 通过类的任何实例:fluffy.speciesbuddy.species

这两种方式将得到相同的结果。这就像问,“狗是什么物种?”或“Fluffy是什么物种?”——答案是一样的!

修改类属性

类属性可以进行修改,但要注意!当你修改一个类属性时,它会对类的所有实例产生影响。让我们看一个例子:

class Cat:
species = "Felis catus"
count = 0

def __init__(self, name):
self.name = name
Cat.count += 1

whiskers = Cat("Whiskers")
mittens = Cat("Mittens")

print(Cat.count)  # 输出: 2
print(whiskers.count)  # 输出: 2
print(mittens.count)  # 输出: 2

Cat.species = "Felis silvestris catus"

print(Cat.species)  # 输出: Felis silvestris catus
print(whiskers.species)  # 输出: Felis silvestris catus
print(mittens.species)  # 输出: Felis silvestris catus

在这个例子中,我们使用一个类属性 count 来跟踪我们创建了多少只猫。每当我们创建一个新的 Cat 对象时,我们都会递增 Cat.count。我们还通过修改 Cat.species 一次性更改了所有猫的 species

类属性的意义

类属性在以下几种情况下非常有用:

  1. 存储应为类的所有实例相同的常量。
  2. 跨越类的所有实例跟踪数据(如我们的 Cat.count 示例)。
  3. 定义可以如果需要的话在实例中被覆盖的默认值。

内置类属性

Python类带有一些内置属性,它们可能非常有帮助。让我们看看其中的一些:

class MyClass:
x = 5

def my_method(self):
pass

print(MyClass.__name__)  # 输出: MyClass
print(MyClass.__doc__)  # 输出: None(因为我们没有提供文档字符串)
print(MyClass.__dict__)  # 输出: {'__module__': '__main__', 'x': 5, 'my_method': <function MyClass.my_method at ...>}
print(MyClass.__module__)  # 输出: __main__

访问内置类属性

以下是一些常见的内置类属性及其访问方式的表格:

属性 描述 访问
name 类的名称 MyClass.name
doc 类的文档字符串 MyClass.doc
dict 包含类的命名空间的字典 MyClass.dict
module 定义类的模块的名称 MyClass.module
bases 包含基类的元组 MyClass.bases

实例属性

现在我们理解了类属性,让我们简要地谈谈实例属性以了解它们的区别。实例属性是针对从类创建的每个对象特有的。

class Student:
school = "Python High"  # 类属性

def __init__(self, name, grade):
self.name = name  # 实例属性
self.grade = grade  # 实例属性

alice = Student("Alice", 10)
bob = Student("Bob", 11)

print(Student.school)  # 输出: Python High
print(alice.school)    # 输出: Python High
print(bob.school)      # 输出: Python High

print(alice.name)      # 输出: Alice
print(bob.name)        # 输出: Bob

Student.school = "Python University"
print(alice.school)    # 输出: Python University
print(bob.school)      # 输出: Python University

alice.school = "Python Elementary"
print(alice.school)    # 输出: Python Elementary
print(Student.school)  # 输出: Python University
print(bob.school)      # 输出: Python University

实例属性与类属性

实例属性和类属性之间的主要区别是:

  1. 类属性由所有实例共享,而实例属性是每个实例所特有的。
  2. 类属性在类中定义,但在任何方法之外,而实例属性通常在 __init__ 方法内定义。
  3. 修改类属性会影响所有实例(除非实例已经覆盖了它),而修改实例属性只会影响特定的实例。

请记住,当您尝试在实例上访问属性时,Python首先查找实例属性。如果没有找到,它会查找类属性。这就是为什么我们可以通过创建具有相同名称的实例属性来为特定实例“覆盖”类属性。

以上就是Python类属性的速成课程。记住,掌握编程的关键是实践。所以不要害怕尝试这些概念。创建自己的类,摆弄属性,看看会发生什么。祝你编程愉快!

Credits: Image by storyset