简明 Python 教程(第9章 面向对象编程)

本章开始介绍Python的面向对象编程,Python这种动态语言的面向对象和很多强类型语言如JAVA,C#,C++等语法上区别还是比较大的,但总体思路基本还是相通的。面向对象编程是一种编程范式,它使用对象来表示现实世界中的实体,并通过这些对象的交互来实现程序的功能。

面向对象编程的核心概念

  1. 类(Class):类是对象的蓝图,定义了对象的属性(变量)和行为(方法)。在Python中,你使用class关键字来定义类。

  2. 对象(Object):对象是类的实例。每个对象都拥有类定义的属性和方法。对象的创建通常通过调用类的构造方法(__init__)来完成。

  3. 继承(Inheritance):继承是一种机制,子类(派生类)可以继承父类(基类)的属性和方法。这允许代码重用和扩展现有类的功能。

  4. 封装(Encapsulation):封装是将对象的内部状态(属性)和行为(方法)捆绑在一起,并对外隐藏其内部实现细节的过程。这有助于保护对象的完整性和简化编程。

  5. 多态(Polymorphism):多态允许不同的对象对同一消息做出响应,即使这些对象可能是不同类的实例。这意味着同一个接口可以用于不同的数据类型。

类和对象

在Python中,定义一个类并创建对象的基本语法如下:

class MyClass: def __init__(self, attribute): self.attribute = attribute def my_method(self): # 做一些操作 pass 
# 创建对象 
my_object = MyClass("some value")

在这个例子中,MyClass是一个类,它有一个构造方法__init__和一个普通方法my_methodself是对象的引用,用于访问对象的属性和方法。

方法

类的方法是定义在类内部的函数,它们用于执行类实例(对象)的操作。在面向对象编程中,方法是类的重要组成部分,因为它们定义了对象的行为。以下是类方法的详细介绍:

  • 实例方法

实例方法是类中最常用的方法类型,它们作用于类的单个实例。实例方法的第一个参数总是self,它是对当前对象实例的引用。通过self,方法可以访问和修改对象的属性。

class Person: def __init__(self, name): self.name = name # 实例变量 def say_hello(self): # 实例方法 print(f"Hello, my name is {self.name}.")

在这个例子中,say_hello是一个实例方法,它使用self来访问name属性。

  • 类方法和静态方法

除了实例方法外,Python还支持类方法(Class Methods)和静态方法(Static Methods)。

    类方法:使用@classmethod装饰器定义,它们的第一个参数是cls,表示类本身。类方法可以访问类属性和其他类方法,但不能直接访问实例属性。

  1. 当你需要定义一个方法,它需要访问类的属性或其他类方法时。
  2. 当方法需要修改类级别的属性或状态时。
  3. 用于实现类的行为,而不是特定实例的行为。
class MyClass:counter = 0  # 类变量@classmethoddef get_counter(cls):return cls.counterdef __init__(self):MyClass.counter += 1# 通过类名调用
print(MyClass.get_counter())  # 输出类变量的值# 通过实例调用
instance = MyClass()
print(instance.get_counter())  # 输出更新后的类变量的值

    静态方法:使用@staticmethod装饰器定义,它们不接收selfcls参数,因此不能访问类或实例的属性。静态方法就像普通函数,但它们属于类的命名空间。

  1. 当你需要定义一个与类的具体实例无关的方法时。
  2. 当方法不需要访问类的属性或其他方法时。
  3. 用于实现与类相关的功能,而不是与实例相关。
class MyClass: @staticmethod def add(x, y): return x + y 
# 通过类名调用
result = MyClass.add(5, 3) # 通过实例调用(实例在方法内部不会被使用)
instance = MyClass()
result = instance.add(10, 20) # 返回 30

   

  • 构造方法和析构方法

    构造方法__init__):当创建类的新实例时自动调用。用于初始化对象的状态。

class Person: def __init__(self, name): self.name = name

    析构方法__del__):当对象被销毁时自动调用。Python的垃圾回收机制会自动处理对象的销毁,因此析构方法在Python中不如在其他语言中常见。

class Person: def __del__(self): print(f"Person {self.name} has been deleted.")
  • 特殊方法

Python中还有许多特殊方法,它们用于自定义对象的行为,如字符串表示(__str__)、比较操作(__eq__, __lt__, __gt__等)和迭代(__iter__, __next__)等。

class Person: def __str__(self): return f"Person(name={self.name})"

__str__方法的作用类似C#中的重载toString()方法。

  • 方法重写

子类可以重写父类的方法,以实现自己的行为:

class Base: def my_method(self): print("Base class method.") class Derived(Base): def my_method(self): print("Derived class method.") derived = Derived() 
derived.my_method() # 输出: Derived class method.
  •  继承

继承允许创建新类来扩展现有类的功能。子类可以继承父类的属性和方法,并可以添加新的属性和方法或重写现有的方法。

class Parent: def parent_method(self): print("这是父类的方法") class Child(Parent): def child_method(self): print("这是子类的方法") # 使用子类创建对象 
child = Child() 
child.parent_method() # 继承自父类的方法 
child.child_method() # 子类自己的方法
  • 封装

封装是面向对象编程的一个重要原则,它通过使用访问修饰符(如publicprivateprotected)来控制对对象内部状态的访问。在Python中,通常使用单下划线(_)前缀来表示受保护的属性或方法,双下划线(__)前缀来表示私有属性或方法。

  • 多态

多态允许将不同类的对象视为相同类型,只要它们实现了相同的接口。在Python中,这通常是通过定义虚方法(如__add____mul__等)来实现的。

class Animal: def speak(self): pass class Dog(Animal): def speak(self): return "汪汪汪" class Cat(Animal): def speak(self): return "喵喵喵" def make_animal_speak(animal): print(animal.speak()) dog = Dog() 
cat = Cat() 
make_animal_speak(dog) # 输出: 汪汪汪 
make_animal_speak(cat) # 输出: 喵喵喵

在这个例子中,DogCat类都实现了speak方法,它们可以被统一处理,展示了多态性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ :STL中vector扩容机制

vector是STL提供的动态数组,它会在内部空间不够用时动态的调整自身的大小,调整过程中会有大量的数据拷贝,为了减少数据拷贝的次数vector会在调整空间的时候尽量多申请一些空间,这些预留出的空间可以很大程度上减少拷贝的发生。 在…

适合新手小白的wordpress详细安装教程

1、下载程序 到wordpress官方网站下载wordpress程序,官方下载地址:Download | WordPress.org China 简体中文。 下载最新版的wordpress程序 https://cn.wordpress.org/latest-zh_CN.zip 2、上传程序 上传程序前先确认主机是否符合安装的环境要求&…

文件压缩与解压命令

(1)tar 打包或解包 tar 将文件打包tar cvf xxxx.tar(打包好的名字) 需要打包的所有文件名 各参数的意义如下: c:创建包文件 f:指定目标为文件而不是设备; v:显示详细过程; t:显示包中的内容而不释放; x:释放包中的内容 z:GNU版本新加的,使得tar有压缩和解压的功能; 解…

爬虫基础训练题

1.抓取imooc网站实战课程部分的课程名称(所有课程大概7页,抓取1到5页),并把所有课程名称存储为txt文件第一页地址 2.设置一个请求头(headers),这是一个字典,用于在HTTP请求中设置请…

wordpress搬家修改前缀后台无法访问

wordpress更换域名后,后台不能访问,出现以下提示:Sorry, you are not allowed to access this page. 出现这种情况一般是因为更改了数据表的前缀了,比如,由原来的wp_改为了wp_louyuwu_ 解决办法: 1、打开…

【C++】 switch 语句case后面可以跟 string变量吗? case后面可以怎么跟 string变量?

文章目录 在 C 中,case 语句通常是用于 switch 语句中,用来匹配整数或枚举类型的常量。在标准的 C 中,case 语句后面不能直接跟字符串变量,因为 case 语句要求其后面是一个常量表达式。 如果想在 switch 语句中匹配字符串&#x…

职场人必备!效率翻倍的多微信号必备管理工具大揭秘

在职场中,高效率的工作方式是非常重要的。而为了提高工作效率,合理运用一些工作神器也是必不可少的。今天给大家分享一个多微信号管理工具——微信管理系统,它能够帮助职场人员管理多个微信号,让工作变得更加高效。 首先&#xf…

mamba的学习记录

最近新出了一种很火的架构mamba,听说吊打transformer,特此学习一下,总结一下学习的内容。 state-spaces/mamba (github.com)3个月8Kstar,确实有点受欢迎。 目录 1.先验 RNN​ LSTM ​2.mamba State Space Models​ Selecti…

Django 自定义中间件(IP限制频率、用户权限)

【一】用户权限 (1)要求 不同的用户,有不同的操作权限比如 超级管理员,拥有所有权限管理员可以增加、查询、修改普通用户只能查询 (2)逻辑梳理 理论来说,这个权限需要保存在数据库中 但是这…

React和Vue.js的有什么区别

在当今前端开发领域,React 和 Vue.js 作为两大热门的前端框架备受开发者关注。它们各自拥有独特的特点和优势,在实际项目中有着广泛的运用。本文将深入探讨 React 和 Vue.js 之间的区别,从组件化方式、数据绑定、模板语法以及生态系统和工具支…

案例 | 华院计算x第一财经:我和我的数智人唱双簧

创新关乎命运,科技引领未来。生成式人工智能(AIGC)给传媒行业发展带来严峻挑战的同时,也带来千载难逢的重大发展机遇。2024年政府工作报告中提出,要深化大数据、人工智能等研发应用,开展“人工智能”行动,打造具有国际…

俚语加密漫谈

俚语加密是一种古老而有效的通信方式,将特定词语或短语在群体内赋予特殊含义,从而隐藏真实信息。类似于方言,它在历史上的应用不可忽视。随着计算机时代的到来,现代密码学通过数学运算编织密语,使得加密变得更加高深莫…

【win10 win11添加右键】git bash

打开注册表编辑器。 按下Win键 R,然后输入”regedit”并按下回车键来打开注册表编辑器。计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\git_bash\command2. 导航到注册表路径:依次展开”HKEY_CLASSES_ROOT\Directory\Background\shell”。右键…

【数据结构】 HashMap源码分析(常量+构造方法+方法)

文章目录 HashMap源码分析一、成员常量二、构造方法三、方法1.此时假定为进行了无参构造,没有分配内存2.当发生有参构造时,完成对容量的大小判断后,将容量大小,传进tableSizeFor方法中: HashMap源码分析 一、成员常量…

iptables笔记

简介: iptables的前身叫ipfirewall (内核1.x时代,当内核发展到2.x系列的时候,软件更名为ipchains,现在更名iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。 工作在用户空间中&…

如何使用Docker轻松构建和管理应用程序(二)

上一篇文章介绍了 Docker 基本概念,其中镜像、容器和 Dockerfile 。我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容,同时在我们后期的微…

JDK8中ArrayList扩容机制

前言 这是基于JDK8的源码分析&#xff0c;在JDK6之前以及JDK11之后细节均有变动&#xff01;&#xff01; 首先来看ArrayList的构造方法 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Seriali…

VUE3——Proxy API 与VUE2——defineProperty API区别

一、Object.defineProperty 定义&#xff1a;Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象 为什么能实现响应式 通过defineProperty 两个属性&#xff0c;get及set get 属性的 getter 函…

LeetCode刷题---查询近30天活跃用户数

1.给出满足的条件&#xff0c;截止至2019-07-27的近30天 activity_date BETWEEN DATE_ADD(2019-07-27,INTERVAL -29 day) and 2019-07-27这里使用了Between and 函数和 Date_add函数 2.按照日期分组&#xff0c;统计活跃用户个数 select activity_date day,count(distinct(us…

Python学习之-基础语法

第1关&#xff1a;行与缩进 任务描述 本关任务&#xff1a;改正代码中不正确的缩进&#xff0c;使其能够正常编译&#xff0c;并输出正确的结果。 编程要求 根据提示&#xff0c;改正右侧编辑器中代码的缩进错误&#xff0c;使其能够正确运行&#xff0c;并输出结果。 测试说明…