Python - 类属性
大家好,有抱负的程序员们!今天,我们将深入探讨Python类属性的激动人心的世界。如果你是编程新手,不用担心;我会一步一步引导你完成这次旅程,就像我多年来对我的学生所做的那样。那么,让我们开始吧!
类属性(变量)
类属性是属于整个类而不是类的特定实例的变量。可以将它们视为该类所有对象共享的特性。
让我们从一个简单的例子开始:
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
对象都共享这个属性。
访问类属性
正如上面的例子所示,您可以通过以下两种方式访问类属性:
- 通过类本身:
Dog.species
- 通过类的任何实例:
fluffy.species
或buddy.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
。
类属性的意义
类属性在以下几种情况下非常有用:
- 存储应为类的所有实例相同的常量。
- 跨越类的所有实例跟踪数据(如我们的
Cat.count
示例)。 - 定义可以如果需要的话在实例中被覆盖的默认值。
内置类属性
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
实例属性与类属性
实例属性和类属性之间的主要区别是:
- 类属性由所有实例共享,而实例属性是每个实例所特有的。
- 类属性在类中定义,但在任何方法之外,而实例属性通常在
__init__
方法内定义。 - 修改类属性会影响所有实例(除非实例已经覆盖了它),而修改实例属性只会影响特定的实例。
请记住,当您尝试在实例上访问属性时,Python首先查找实例属性。如果没有找到,它会查找类属性。这就是为什么我们可以通过创建具有相同名称的实例属性来为特定实例“覆盖”类属性。
以上就是Python类属性的速成课程。记住,掌握编程的关键是实践。所以不要害怕尝试这些概念。创建自己的类,摆弄属性,看看会发生什么。祝你编程愉快!
Credits: Image by storyset