news 2026/4/15 15:23:17

9.Python面向对象 -类和对象

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
9.Python面向对象 -类和对象

1. 什么是面向对象编程(OOP)?

面向对象编程(Object-Oriented Programming,OOP)是一种程序设计范式,它以对象为中心,将数据和操作数据的方法(函数)组合到一个单元中,这个单元就是对象。每个对象都是类的一个实例,而类则定义了对象的属性(数据)和方法(代码)。换句话说,面向对象编程将现实世界中的实体抽象为程序中的对象,这些对象可以相互交互、传递消息,并且可以继承和扩展。

面向对象编程通常具有以下几个核心概念:

  • 类(Class):定义了对象的模板,包括数据和方法。
  • 对象(Object):类的实例,具有特定的属性和方法。
  • 封装(Encapsulation):将数据(属性)和操作数据的方法(函数)封装到对象中,使得对象的内部细节对外部不可见。
  • 继承(Inheritance):允许一个类(子类)继承另一个类(父类)的属性和方法,并且可以添加自己的特定属性和方法。
  • 多态(Polymorphism):允许不同类的对象对同一个方法做出不同的响应,提高代码的灵活性和可重用性。
很好,上面的概念,你已经云里雾里了。那么下面我们简单来讲一下。

一个简单的例子:

假设我们要模拟一个动物园中的动物。我们可以使用定义一个 Animal(动物),并创建具体的动物对象。这就是面向对象编程的两个概念了,类、对象。

# 定义 Animal(动物)类 class Animal: def __init__(self, name, age): self.name = name self.age = age def make_sound(self): pass # 定义具体的动物类:猫(Cat)和狗(Dog) class Cat(Animal): def make_sound(self): return "Meow" class Dog(Animal): def make_sound(self): return "Woof" # 创建动物对象 cat1 = Cat("Kitty", 3) dog1 = Dog("Buddy", 5) # 调用动物对象的方法 print(cat1.name, "says:", cat1.make_sound()) # 输出:Kitty says: Meow print(dog1.name, "says:", dog1.make_sound()) # 输出:Buddy says: Woof

上面的代码,我们一步步来说:

第一步:首先定义了一个Animal(动物)类,它有两个属性 name(名字)和 age(年龄)。在 __init__构造函数中,我们初始化了这两个属性。

第二步:Animal 类有一个 make_sound(发出声音)方法,但在基类中我们只定义了方法的签名,没有具体的实现。这是因为我们无法确定所有动物的叫声,具体的叫声会在子类中实现。

第三步:然后我们定义了两个具体的动物类 Cat(猫)和 Dog(狗),它们都继承自 Animal 类。这意味着 Cat 和 Dog 类会继承 Animal 类的属性和方法,并且可以根据需要添加自己的属性和方法。

第四步:在 Cat 类和 Dog 类中,我们重写了 make_sound 方法,分别返回了猫和狗的叫声

第五步:最后,我们创建了两个具体的动物对象 cat1 和 dog1,分别是一只名叫 "Kitty" 的猫和一只名叫 "Buddy" 的狗。

第六步:我们调用了这两个动物对象的 make_sound 方法,并打印出它们的名字和叫声。

上面总共讲了6步,6步里面涉及到了:类(Class)、对象(Object)、封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。这些概念,具体怎么看呢?往下看:

  • :Animal、Cat、Dog 分别是类,它们定义了对象的模板,包括属性和方法。
  • 对象:cat1 和 dog1 是 Cat 和 Dog 类的对象,它们是具体的实例,具有特定的属性和方法。
  • 封装:每个动物对象封装了自己的属性 name 和 age,并且调用了自己的 make_sound 方法。
  • 继承:Cat 和 Dog 类继承了 Animal 类的属性和方法,避免了重复定义。
  • 多态:make_sound 方法在不同的子类中表现出不同的行为,根据对象的类型返回不同的叫声。
那么,你现在将这些概念,一个个对应到前面的六步中去,

2. 类和对象

让我们以一个仍然用上面的例子来说明什么是类和对象。我们创建了一个"动物"(Animal)类,然后创建该类的对象,比如"狗"(Dog)和"猫"(Cat)。

2.1 类的定义和创建

我们可以定义一个"动物"(Animal)类,该类具有一些基本属性(如名称和年龄),以及一些行为(如发出声音)。

class Animal: def __init__(self, name, age): self.name = name self.age = age def make_sound(self): pass # 此处留空,因为这是一个抽象的动作,每种动物发出的声音不同,后续会在子类中实现

在这个类中,我们定义了一个构造函数__init__(),它接收 name 和 age 作为参数,并将它们分配给对象的属性。我们还定义了一个 make_sound() 方法,但目前它什么也不做,因为每种动物发出的声音都不同,所以我们会在子类中覆盖这个方法。

2.2 对象的创建和使用

现在,让我们创建具体的动物对象,比如一个狗对象和一个猫对象,并使用它们的属性和方法。

class Dog(Animal): def make_sound(self): return "Woof!" class Cat(Animal): def make_sound(self): return "Meow!" # 创建狗对象和猫对象 my_dog = Dog("Buddy", 3) my_cat = Cat("Whiskers", 5) # 访问对象的属性 print(f"My dog's name is {my_dog.name} and it is {my_dog.age} years old.") print(f"My cat's name is {my_cat.name} and it is {my_cat.age} years old.") # 调用对象的方法 print(f"My dog says: {my_dog.make_sound()}") print(f"My cat says: {my_cat.make_sound()}")

2.3 类和对象的关系

在这个例子中,Animal 是一个基类(父类),它定义了动物的基本属性和方法。然后,Dog 和 Cat 是 Animal 类的子类(也可以称为派生类),它们继承了 Animal 类的属性和方法,并且还可以定义自己独特的属性和方法。

当我们创建 my_dog 和 my_cat 时,实际上是在内存中实例化了两个对象,每个对象都有自己的 name 和 age 属性,并且可以调用 make_sound() 方法。

类是对对象的抽象,它定义了对象的属性和方法。对象是类的实例,它具体化了类的定义,并可以执行类中定义的操作。

类和对象之间的关系就像是模具和制造出的产品之间的关系:模具定义了产品的形状和特性,而产品则是模具的具体实例。

2.4 属性和方法

2.4.1 实例属性和类属性

  • 实例属性:实例属性是指属于特定实例的属性。它们在创建实例时被赋予,并且每个实例都可以有不同的值。通常在类的 __init__ 方法中初始化。
class Car: def __init__(self, make, model, year): self.make = make self.model = model self.year = year

在这里,make, model, 和 year 就是 Car 类的实例属性。

  • 类属性:属于类本身的属性,被所有类的实例共享。可以直接在类定义中设置。
class Car: num_cars = 0 # 类属性 def __init__(self, make, model, year): self.make = make self.model = model self.year = year Car.num_cars += 1 # 每创建一个实例,num_cars 加一

在这里,num_cars 就是 Car 类的类属性,它被所有 Car 类的实例共享。

2.4.2 实例方法和类方法

  • 实例方法:操作实例的方法,第一个参数通常是 self,代表对象本身。可以访问实例属性,并且可以改变实例的状态。
class Car: def __init__(self, brand): self.brand = brand self.speed = 0 def accelerate(self, amount): self.speed += amount def brake(self, amount): self.speed -= amount car1 = Car("Toyota") print(car1.speed) # 输出: 0 car1.accelerate(50) print(car1.speed) # 输出: 50 car1.brake(20) print(car1.speed) # 输出: 30

accelerate 、brake 就是 Car 类的实例方法,用于打印汽车信息。

  • 类方法:操作类属性的方法,使用 @classmethod 装饰器定义,第一个参数通常是 cls,代表类本身。可以访问类属性,并且可以在整个类上执行操作。
class Dog: num_of_dogs = 0 def __init__(self, name): self.name = name Dog.num_of_dogs += 1 @classmethod def get_num_of_dogs(cls): return cls.num_of_dogs dog1 = Dog("Buddy") dog2 = Dog("Max") print(Dog.get_num_of_dogs()) # 输出: 2
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 16:36:29

目前市场上主流的AI数字人开发框架有哪些?

在数字化转型的浪潮下,AI数字人已成为从虚拟主播、智能客服到企业代言人的重要工具。但对于开发者而言,面对众多技术方案,如何选择合适的主流开发框架是一大挑战。本文将对当前市场主流的AI数字人开发框架进行梳理,为你提供一份清…

作者头像 李华
网站建设 2026/4/15 12:30:24

终于有人把网络安全运维工程师需要学什么讲清了!

终于有人把网络安全运维工程师需要学什么讲清了! 什么是安全运维工程师? 安全运维工程师是网络安全大方向下网络安全运行与维护的一个细分岗****位。 主要负责对服务器、网络设备、安全产品、网络信息系统等进行安全维护、安全巡检、策略维护管理、配置…

作者头像 李华
网站建设 2026/4/10 10:36:07

Go语言真正强的领域是什么?

Go 语言以并发实现简单而著称,现在无数云原生项目都在用它。甚至在人工智能领域,它也开始发力了。今天我们就来聊聊这个由谷歌推出的热门编程语言。 问世十五年多了,Go 语言已经从技术爱好者眼里的“新鲜玩意儿”,成长为支撑全球关…

作者头像 李华
网站建设 2026/4/8 18:51:10

Agent记忆模块深度解析:小白也能掌握的面试加分项收藏必备

本文深入浅出地讲解了Agent记忆模块的重要性、类型(短期与长期)及其在工程实践中的应用。文章从原理认知出发,结合工程取舍和面试表达,通过实战案例展示了记忆模块如何实现上下文持久化与一致性。内容覆盖了存储方式、记忆内容选择…

作者头像 李华
网站建设 2026/4/14 2:35:09

基于STM32语音识别的智能家居

基于STM32语音识别的智能家居控制系统设计 第一章 绪论 传统智能家居控制系统多依赖手机APP或触控操作,存在交互门槛高、操作繁琐、无法解放双手等问题,尤其不适用于老人、儿童等群体使用。STM32单片机凭借低功耗特性、外设拓展性强、运算效率适配嵌入式…

作者头像 李华
网站建设 2026/4/9 10:54:10

北京聚信万通科技有限公司应Odette组织邀请加入OFTP2 专家组

近日,国内B2B/EDI数据交换领域的标杆企业——北京聚信万通科技有限公司(以下简称“聚信万通”)正式收到Odette国际组织(Organisation for Data Exchange through Tele-Transmission in Europe欧洲电信传输数据交换组织&#xff09…

作者头像 李华