让我们将本章所学内容付诸实践。我们将定义一个简单类,从它创建对象,并与这些对象的属性和方法进行互动。这个动手实践将帮助你更好地明白类如何作为蓝图,而对象则是从这些蓝图实际构建的事物。假设我们想在程序中表示狗。每只狗可能都有名字和品种。狗也能执行动作,比如吠叫。让我们用一个类来表示这一点。定义 Dog 类使用 class 关键字,然后指定类的名称(按照惯例,类名以大写字母开头)。class Dog: pass # 'pass' 是一个占位符,表示“暂时不做任何事”这是最简单的类定义。它目前没有太多功能,但这是一个有效的起点。使用 __init__ 初始化对象为了让我们的 Dog 对象有功能,它们需要名字和品种之类的数据。我们使用特殊的 __init__ 方法(常被称为构造函数)来设置对象创建时的初始状态。请记住,类中任何方法的第一个参数通常命名为 self。它指代正在创建或操作的特定实例(对象)。class Dog: # __init__ 方法用于初始化新的 Dog 对象 def __init__(self, name, breed): # 'self' 指代正在创建的实例 # 我们将传入的名字和品种存储为该实例的属性 self.name = name self.breed = breed print(f"Dog object named '{self.name}' created!") # 现在,当我们创建 Dog 对象时,__init__ 会自动运行在 __init__ 内部,我们接收 name 和 breed 作为参数(除了 self)。然后,我们使用 self.attribute_name = value 将这些值分配给对象的属性。因此,self.name = name 在正在创建的特定 Dog 对象上创建一个名为 name 的属性,并将提供的 name 值赋给它。类似地,self.breed = breed 存储品种。使用方法添加行为对象不仅能保存数据;它们还能执行动作。我们将这些动作定义为类中的方法。方法是定义在类内部的函数。让我们添加一个 bark 方法。class Dog: def __init__(self, name, breed): self.name = name self.breed = breed print(f"Dog object named '{self.name}' created!") # 定义 Dog 可以执行的动作的方法 def bark(self): # 方法也把 'self' 作为第一个参数 # 这使得方法可以访问对象的属性 print(f"{self.name} says: Woof!") 注意 bark 方法也将 self 作为其第一个参数。这很重要,因为它允许方法访问对象自身的数据,比如它的 name 属性(self.name)。创建和使用 Dog 对象(实例)现在我们有了 Dog 的蓝图(类),就可以创建实际的 Dog 对象(实例)。创建实例看起来就像调用类名,就像调用函数一样,并传入 __init__ 方法所需的参数(不包括 self,Python 会自动处理)。# 创建第一个 Dog 实例 dog1 = Dog("Buddy", "Golden Retriever") # 创建第二个 Dog 实例 dog2 = Dog("Lucy", "Poodle")运行这段代码时,每次对象创建都会调用 __init__ 方法,你会看到“Dog object created!”的消息打印出来。我们现在有了两个独立的 Dog 对象,分别存储在变量 dog1 和 dog2 中。访问属性和调用方法有了对象后,你可以使用点号表示法(object.attribute_name)访问其属性,并使用点号表示法后跟括号(object.method_name())调用其方法。# 访问 dog1 的属性 print(f"{dog1.name} is a {dog1.breed}.") # 输出:Buddy 是一只金毛寻回犬。 # 访问 dog2 的属性 print(f"{dog2.name} is a {dog2.breed}.") # 输出:Lucy 是一只贵宾犬。 # 调用 dog1 的 bark 方法 dog1.bark() # 输出:Buddy 说:汪! # 调用 dog2 的 bark 方法 dog2.bark() # 输出:Lucy 说:汪!注意 dog1.bark() 打印了 Buddy 的名字,而 dog2.bark() 打印了 Lucy 的名字。尽管它们共享类中相同的 bark 方法定义,但由于 self 参数,该方法作用于被调用的特定对象。完整示例代码这是我们的简单 Dog 类及其用法的完整代码:# 定义 Dog 类 class Dog: # 构造函数,用于初始化属性 def __init__(self, name, breed): self.name = name # 赋值名字属性 self.breed = breed # 赋值品种属性 print(f"Dog object named '{self.name}' of breed '{self.breed}' created.") # 狗的行为方法 def bark(self): print(f"{self.name} says: Woof!") # 另一个示例方法 def describe(self): print(f"This dog is named {self.name} and is a {self.breed}.") # --- 使用类 --- # 创建 Dog 类的实例(对象) my_dog = Dog("Rex", "German Shepherd") your_dog = Dog("Daisy", "Beagle") print("\n--- 访问属性 ---") # 使用点号表示法访问对象属性 print(f"我的狗的名字: {my_dog.name}") print(f"你的狗的品种: {your_dog.breed}") print("\n--- 调用方法 ---") # 使用点号表示法调用对象方法 my_dog.bark() your_dog.bark() my_dog.describe() your_dog.describe() 自己运行这段代码。尝试在 __init__ 方法中添加更多属性(比如 age),或者创建更多方法(比如 wag_tail())。这种动手操作对于理解 OOP 如何通过将数据(属性)和行为(方法)组合成称为对象的逻辑单元来帮助组织代码非常有用。