Python入门-面向对象

1.类和对象

在这里插入图片描述
是不是很熟悉?和Java一样,在Python中,都可以把万物看成(封装成)对象。它俩都是面向对象编程

1.1 查看对象数据类型

a = 10
b = 9.8
c = 'hello'print(type(a))
print(type(b))
print(type(c))

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-1查看对象的数据类型.py 
<class 'int'>
<class 'float'>
<class 'str'>

1.2 自定义数据类型

# 编写一个 Person
class Person():pass# 编写一个 Cat 类
class Cat():pass# 编写一个 Dog 类
class Dog:passclass Student:pass

1.3 创建自定义类型的对象

# 编写一个 Person
class Person():pass# 编写一个 Cat 类
class Cat():pass# 编写一个 Dog 类
class Dog:passclass Student:pass#创建类的对象
# 对象名=类名()# 创建一个 Person 类型的对象
per=Person()
c=Cat()
d=Dog()
stu=Student()print(type(per))
print(type(c))
print(type(d))
print(type(stu))

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-3创建自定义类型的对象.py 
<class '__main__.Person'>
<class '__main__.Cat'>
<class '__main__.Dog'>
<class '__main__.Student'>

1.4 类属性和实例属性的定义

class Student:# 类属性: 定义在类中,方法外的变量school = '北京大学'# 初始方法方法def __int__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.nameself.age = age  # 实例的名称和局部变量的名称可以相同

1.5 类的组成

class Student:# 类属性: 定义在类中,方法外的变量school = '北京大学'# 初始方法方法def __init__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.nameself.age = age  # 实例的名称和局部变量的名称可以相同# 定义在类中的函数,成为方法,自带一个 参数 selfdef show(self):print(f'我叫:{self.name},今年{self.age}岁了')# 静态方法@staticmethoddef sm():# print(self.name)# self.show()print('这是一个静态方法,不能调用实例属性,也不能调用实例方法')# 类方法@classmethoddef cm(cls):  # cls--> class 的简写print('这是一个类方法,不能调用实例属性,也不能调用实例方法')# 创建类的对象
stu = Student('Jarvis', 21)   # 为什么传了两个参数?因为 __init__ 方法中,有两个形参, self 是自带的参数,无需手动传入# 实例属性,使用对象名 进行打点调用
print(stu.name,stu.age)#类属性,直接使用 类名,打点调用
print(Student.school)#示例方法,使用对象名 打点调用
stu.show()# 类方法 @classmethod 进行修饰的方法,直接使用类名打点调用
Student.cm()# 静态方法 ,直接使用 类名打点调用
Student.sm()

1.6 编写学生类创建4个学生对象

class Student:# 类属性: 定义在类中,方法外的变量school = '北京大学'# 初始方法方法def __init__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.nameself.age = age  # 实例的名称和局部变量的名称可以相同# 定义在类中的函数,成为方法,自带一个 参数 selfdef show(self):print(f'我叫:{self.name},今年{self.age}岁了')# 根据 "图纸" 可以创建出 N多个对象
stu = Student('jarvis', 18)
stu2 = Student('zhangsan', 19)
stu3 = Student('lisi', 20)
stu4 = Student('wangwu', 21)print(type(stu))
print(type(stu2))
print(type(stu3))
print(type(stu4))Student.school = '清华大学'  # 给类的属性赋值# 将学生对象存储到列表中
lst = [stu, stu2, stu3, stu4]  # 列表中的元素是 Student类型的对象
for item in lst:item.show()   # 对象打点调用实例方法

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-6编写学生类创建4个学生对象.py 
<class '__main__.Student'>
<class '__main__.Student'>
<class '__main__.Student'>
<class '__main__.Student'>
我叫:jarvis,今年18岁了
我叫:zhangsan,今年19岁了
我叫:lisi,今年20岁了
我叫:wangwu,今年21岁了

1.7 动态绑定属性和方法

在这里插入图片描述
代码:

class Student:# 类属性: 定义在类中,方法外的变量school = '北京大学'# 初始方法方法def __init__(self, xm, age):  # xm,age 是方法的参数,是局部变量,作用域 是 整个 __init__方法self.name = xm  # 左侧是实例属性, xm是局部变量,将局部变量的值 xm 赋值给实例属性 self.nameself.age = age  # 实例的名称和局部变量的名称可以相同# 定义在类中的函数,成为方法,自带一个 参数 selfdef show(self):print(f'我叫:{self.name},今年{self.age}岁了')# 创建两个 Student 类型的对象
stu = Student('jarvis', 18)
stu2 = Student('zhangsan', 19)print(stu.name,stu.age)
print(stu2.name,stu2.age)# 为 stu2 动态绑定一个实例属性
stu2.gender='男'
print(stu2.name,stu2.age,stu2.gender)#动态绑定 方法
def introduce():print('我是一个普通的函数,我被动态绑定成了 stu2对象的方法')stu2.fun=introduce()  #函数的一个赋值,(记住方法千万不能加小括号,加小括号就是调用了)
# fun就是stu2对象的方法#调用
stu2.fun

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-7动态绑定属性和方法.py 
jarvis 18
zhangsan 19
zhangsan 19 男
我是一个普通的函数,我被动态绑定成了 stu2对象的方法

2.面向对象三大特征

封装,继承,多态

是的,和Java一样

在这里插入图片描述

2.1 封装-权限控制

在这里插入图片描述
代码:

class Student():#首位双下划线def __init__(self,name,age,gender):self._name=name   # self._name 受保护的,只能本类和子类访问self.__age=age    # self.__age 表示私有的,只能类本身去访问self.gender=gender #普通的实例属性,类的内部,外部,及子类都可以访问def _fun1(self):print('子类及本身可以访问')def __fun2(self):print('只有定义的类可以访问')def show(self): #普通的实例方法self._fun1()  #类本身访问受保护的方法self.__fun2() #类本身访问私有方法print(self._name) #受保护的实例属性print(self.__age) #私有的实例属性#创建一个学生对象
stu=Student('jarvis',23,'男')# 类的外部
print(stu._name)
#print(stu.__age)   # AttributeError: 'Student' object has no attribute '__age'. Did you mean: '_name'?#调用受保护的实例方法
stu._fun1()#私有方法
#stu.__fun2()   #AttributeError: 'Student' object has no attribute '__fun2'. Did you mean: '_fun1'?# 私有的实例属性 和 方法是真的不能访问吗?

私有的实例属性 和 方法是真的不能访问吗?!!!

print(stu._Student__age)   #为什么可以这样访问呢??stu._Student__fun2()

为什么可以这样访问呢??

我们可以用dir()方法查看类所有的方法

print(dir(stu))

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-8权限控制.py 
jarvis
子类及本身可以访问
23
只有定义的类可以访问
['_Student__age', '_Student__fun2', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_fun1', '_name', 'gender', 'show']
2.1.1 属性的设置
class Student:def __init__(self,name,gender):self.name=nameself.__gender=gender  # self.__gender 是私有的实例属性# 使用 @property 修饰方法,将方法转成属性使用@propertydef gender(self):return self.__gender#将我们的 gender 这个属性设置为可写属性@gender.setterdef gender(self,value):if value!='男' and value!='女':print('性别有误,已将性别默认设置为男')self.__gender='男'else:self.__gender=value#
stu=Student('zhangsan','男')
print(stu.name,'性别是:',stu.gender)    # stu.gender 就会去执行 stu.gender()# 尝试修改属性值
#stu.gender='女'   # AttributeError: property 'gender' of 'Student' object has no setterstu.gender='其他'
print('这个学生的性别是:',stu.gender)

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-9属性的设置.py 
zhangsan 性别是: 男
性别有误,已将性别默认设置为男
这个学生的性别是:

2.2 继承

  • 继承

在这里插入图片描述
代码:

class Person:  # 默认继承了 objectdef __init__(self, name, age):self.name = nameself.age = agedef show(self):print(f'大家好,我叫:{self.name},我今年:{self.age}岁')# Student 继承 Person 类
class Student(Person):# 编写初始化的方法def __init__(self, name, age, stuno):super().__init__(name, age)  # 调用父类的初始化方法self.stuno = stuno# Doctor 继承Person 类
class Doctor(Person):# 编写初始化方法def __init__(self, name, age, department):super().__init__(name, age)self.department = department# 创建第一个子类对象
stu = Student('Jarvis', 20, '1001')
stu.show()doctor = Doctor('zhangsan', 35, '外科')
doctor.show()

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-10继承.py 
大家好,我叫:Jarvis,我今年:20岁
大家好,我叫:zhangsan,我今年:35
  • 多继承
class FatherA():def __init__(self, name):self.name = namedef showA(self):print('父类A中的方法')class FatherB():def __init__(self, age):self.age = agedef showB(self):print('父类B中的方法')class Son(FatherA, FatherB):def __init__(self, name, age, gender):# 需要调用两个父类的初始化方法FatherA.__init__(self, name)FatherB.__init__(self, age)self.gender = genderson=Son('Jarvis',22,'男')   # 调用Son类中的 __init__执行
son.showA()
son.showB()

运行结果:

D:\Python_Home\venv\Scripts\python.exe D:\Python_Home\chap9\示例9-11多继承.py 
父类A中的方法
父类B中的方法

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

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

相关文章

k8s-调度 13

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器&#xff0c;并且是集群控制面的一部分。 如果你真的希望或者有…

C#上位机与欧姆龙PLC的通信11----【爆肝】上位机应用开发(Winform版)

1、先上图 前面10讲&#xff0c;让你爽煹了肝&#xff0c;已经进入最后收尾阶段&#xff0c;这节来个常规应用&#xff0c;让前面的技能直接飞上天&#xff0c;我们要做的界面软件是这样的&#xff0c;虽然没有潘金莲漂亮&#xff0c;但也是爆抱&#xff1a; 2、如何爆&#x…

爬虫到底违法吗?你离违法还有多远?

最近&#xff0c;国家依法查处了部分编写爬虫程序&#xff0c;盗取其他公司数据的不良企业。一时间风声鹤唳&#xff0c;关于爬虫程序是否违法的讨论遍布程序员圈子。那么到底编写爬虫程序是否违法呢&#xff1f; 其爬虫下载数据&#xff0c;一般而言都不违法&#xff0c;因为…

【机器学习】模型调参工具:Hyperopt 使用指南

机器学习| 模型调参工具&#xff1a;Hyperopt 使用指南 前言1. Hyperopt是什么&#xff1f;2. Hyperopt的优缺点3. 如何使用 Hyperopt 进行调参3.1 安装 Hyperopt3.2 构建超参数空间3.3 定义目标函数3.4 运行 Hyperopt 优化3.5 获取最优超参数 4. XGB调参代码示例参考资料 前言…

Hyperledger Fabric Docker 方式多机部署生产网络

规划网络拓扑 3 个 orderer 节点&#xff1b;组织 org1 , org1 下有两个 peer 节点&#xff0c; peer0 和 peer1; 组织 org2 , org2 下有两个 peer 节点&#xff0c; peer0 和 peer1; 因为我只有 3 台虚拟机资源所以没法实现完全的多机部署&#xff0c;资源使用规划如下&#…

智能分析网关V4方案:太阳能+4G+AI识别搭建智慧果园/种植园远程视频监控监管方案

一、方案背景 我国是水果生产大国&#xff0c;果园种植面积大、产量高。由于果园的位置大都相对偏远、面积较大、看守人员较少&#xff0c;值守的工作人员无法顾及园区每个角落&#xff0c;果园财产安全成为了关注的重点。人为偷盗、野生生物偷吃等事件时有发生&#xff0c;并…

磷酸铁锂电池生产污废水需要哪些工艺及设备

磷酸铁锂电池作为一种常见的锂离子电池&#xff0c;已广泛应用于电动汽车、储能系统等领域。然而&#xff0c;在磷酸铁锂电池的生产过程中&#xff0c;难免会产生一定量的污废水。为了有效处理和处理这些污废水&#xff0c;我们需要合适的工艺和设备。 首先&#xff0c;针对磷酸…

制造业卓越管理从6S管理开始

在当今制造业环境中&#xff0c;企业间的竞争愈发激烈&#xff0c;而管理水平的卓越与否&#xff0c;直接决定了企业在市场竞争中的地位和成功与否。管理并非一蹴而就&#xff0c;需要经过不断的实践和探索&#xff0c;逐步提升。其中&#xff0c;6S管理作为现代企业管理的基础…

Ubuntu 卸载重装 Nvidia 显卡驱动

问题描述 我使用 airsim 的时候&#xff0c;发现 UE4 没法使用显卡&#xff0c;导致非常卡顿 输入 nvidia-smi 有显卡型号等信息的输出&#xff0c;但是进程 process 里面没有显示 airsim 和其他软件占用显卡情况 因此&#xff0c;我选择了卸载重装 一.卸载旧版本的驱动 …

内容分发功能升级!一站式搞定文案生成/违规检测/一键分发全流程

随着社交媒体的不断发展&#xff0c;越来越多的企业开始布局新媒体矩阵&#xff0c;从集团总部到区域门店、个人销售&#xff0c;从全品类到细分垂直类目、从单一平台到多平台&#xff0c;试图让品牌影响力覆盖更广泛群体&#xff0c; 当然&#xff0c;随之而来的&#xff0c;如…

深度学习”和“多层神经网络”的区别

在讨论深度学习与多层神经网络之间的差异时&#xff0c;我们必须首先理解它们各自是什么以及它们在计算机科学和人工智能领域的角色。 深度学习是一种机器学习的子集&#xff0c;它使用了人工神经网络的架构。深度学习的核心思想是模拟人脑神经元的工作方式&#xff0c;以建立…

RuntimeError: Placeholder storage has not been allocated on MPS device!解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Web安全测试基础

SQL注入 当下最常用的一个攻击手段&#xff0c;就是通过SQL命令插入到Web表单中或页面请求查询字符串中&#xff0c;最终达到欺骗服务器执行恶意的SQL语句的目的&#xff0c;SQL注入一旦成功&#xff0c;轻则直接绕开服务器验证&#xff0c;直接登录成功&#xff0c;重则将服务…

【Flutter 开发实战】Dart 基础篇:条件循环表达式

Dart 是一门强大的编程语言&#xff0c;其条件和循环表达式在编写灵活、高效代码中起着关键作用。本文将深入介绍 Dart 中的条件表达式、循环表达式、以及关键字如 for、while、do...while、break、continue 等内容&#xff0c;旨在为初学者提供清晰的指导。 1. 条件表达式 D…

Netty开篇——BIO章(二)

Java BIO 基本介绍 属于传统的 java io编程&#xff0c;内容见java.io包中BIO(blocking I/O) : 同步阻塞&#xff0c;服务器实现模式为个连接一个线程&#xff0c;即客户端有连接请求时服务器端就需要启动一个线程进行处理&#xff0c;如果这个连接不做任何事情会造成不必要的线…

数字化转型的关键:JVS低代码的列表页导入功能解析

在当今数字化时代&#xff0c;数据的管理和迁移变得至关重要。为了满足广大用户的需求&#xff0c;JVS低代码精心打造了“列表页导入功能”。这个功能专为高效处理列表页数据而设计&#xff0c;为用户提供了简单、便捷的数据导入、导出和模板下载服务。 列表页导入功能 列表页…

1、理解Transformer:革新自然语言处理的模型

目录 一、论文题目 二、背景与动机 三、卖点与创新 四、解决的问题 五、具体实现细节 0. Transformer 架构的主要组件 1. 注意力、自注意力&#xff08;Self-Attention&#xff09;到多头注意力&#xff08;Multi-Head Attention&#xff09; 注意力到底是做什么的&…

基于JAVA+ssm智能旅游线路规划系统设计与实现【附源码】

基于JAVAssm智能旅游线路规划系统设计与实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql…

Neo4j恢复

主要记录windows环境下从备份文件中恢复Neo4j&#xff0c; Linux环境同理 备份在上一篇中有介绍&#xff0c;参考: Neo4j备份-CSDN博客 误删数据 为了模拟误删除场景&#xff0c;我们查询Person&#xff0c;并模拟误操作将其进行删除&#xff1b; match(p:Person) return …

SQL基础知识3

一、删除数据 1、delete操作 删除之前一定要查询一下&#xff0c;确保删除的数据是对的 逻辑删除&#xff1a;在表中新增一个字段&#xff1a;flag/status 二、更新数据 本质上的逻辑删除 三、查询数据 1、联表查询 1、内连接 交集的部分叫内连接 小知识&#xff1a;一般…