【python学习】面向对象编程3

面向对象基础

面向对象编程

面向过程编程:类似于工厂的流水线。
优点:逻辑清晰;
缺点:扩展性差。

面向对象编程:核心是对象二字,对象是属性和方法的集合体,面向对象编程就是一堆对象交互。
优点:扩展性强;
缺点:逻辑非常乱。

类与对象

对象:属性和方法的集合体。
类:一系列相同属性和方法的集合体。

现实世界中先有对象后有类;
Python中先有类,再实例化对象。

对象的属性的查找顺序

先对象本身 --> 类 --> 父类 --> 父类的父类 --> object --> 自己定制的元类 --> type

给对象定义私有属性

class People:passp1 = People()
p1.name = 'jack'p2 = People()
p2.name = 'tank'

对象的绑定方法

class People:def eat(self):print(self,'eat...')p1 = People()
p1.eat()
p1.name = 'jack'p2 = People()
p2.eat()
p2.name = 'tank'

类与数据类型

# lis = list([1, 2, 3])
lis = [1, 2, 3]
# 对象调用对象绑定的方法,会自动传参
lis.append(4)
# 类调用对象绑定的方法,必须得传参
list.append(lis, 4)

面向对象进阶

类的继承

继承父类,则会有父类的所有属性和方法。

类的派生

继承父类的同时,自己有init,然后也需要父类的init。

类的组合

把类对象可以引用/当做参数传入/当作返回值/当做容器元素,类似于函数对象。

菱形继承问题

新式类:继承object的类,python3中全是新式类。
经典类:没有继承object的类,只有python2中有。

在菱形继承的时候,新式类是广度优先(老祖宗最后找);经典类是深度优先(一路找到底,再找旁边的)。

多态与多态性

一种事物的多种形态。

类的封装

隐藏属性,只有类内部可以访问,类外部不可以访问。

类的property特性

把方法变成属性引用。

类与对象的绑定方法和非绑定方法

没有任何装饰器装饰的方法就是对象的绑定方法,类能调用,但是必须传参给self。
被@classmethod装饰器装饰的方法就是类方法,参数写成cls,cls是类本身,对象也能调用,参数cls还是类本身。
被@staticmethod装饰器装饰的方法就是非绑定方法,就是一个普通的函数。

面向对象高级

isinstance,issubclass

(魔术方法)

isinstance:判断是否为类的实例化对象,会检测父类,而type不会检测父类。(取代type)
type:获取实例化对象的类,不会检测父类。type是用来生成类的。

issubclass判断是否为其子类。

反射

  1. hasattr:通过字符串判断是否类属性存在;
  2. getattr:通过字符串获取类属性;
  3. setattr:通过字符串修改类属性;
  4. delattr:通过字符串删除类属性。

call

对象加()调用的时候触发。

class Foo:def __init__(self):print('Foo()会触发')def __call__(self):print('f()会触发')f = Foo()
f()

new

class Foo:def __new__(self):  print('new')obj = object.__new__(self)return objdef __init__(self):print('init')f = Foo()

元类

元类用来造类的。
元类() --> 类 --> init
元类() () --> 对象 --> call

类分为几部分:类名/类体名称空间/父类们。

class Mymeta(type):def __init__(self, class_name, class_bases, class_dic):# 控制类的逻辑代码super().__init__(class_name, class_bases, class_dic)def __call__(self, *args, **kwargs):# 控制类实例化的参数obj = self.__new__(self) # obj就是实例化的对象self.__init__(obj, *args, **kwargs)# 控制类实例化的逻辑return objclass People(metaclass=Mymeta):def __init__(self, name, age):self.name = nameself.age = age

单例模型

利用类的绑定方法的特性

NAME = 'nick'
AGE = 18class People():__instance = None@classmethoddef from_conf(cls):if cls.__instance:return cls.__instancecls.__instance = cls(NAME, AGE)return cls.__instance

People.from_conf()

利用装饰器

NAME = 'nick'
AGE = 18def deco(cls):cls.__instance = cls(NAME, AGE)def wrapper(*args, **kwargs):if len(args) == 0 and len(kwargs) == 0res = cls(*args, **kwargs)return resreturn wrapper@deco	
class People():def __init__(self, name, age):self.name = nameself.age = age

peo1 = People()
peo2 = People()

利用元类(正宗的)

NAME = 'nick'
AGE = 18class Mymeta(type):def __init__(self, class_name, class_bases, class_dic):super().__init__(class_name, class_bases, class_dic)self.__instance = self(NAME, AGE)def __call__(self, *args, **kwargs):if len(args) == 0 and len(kwargs) == 0return self.__instanceobj = self.__new__(self) self.__init__(obj, *args, **kwargs)return objclass People(metaclass=Mymeta):def __init__(self, name, age):self.name = nameself.age = age 

peo1 = People()
peo2 = People()

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

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

相关文章

Spring 事务原理一

从本篇博客开始,我们将梳理Spring事务相关的知识点。在开始前,想先给自己定一个目标:通过此次梳理要完全理解事务的基本概念及Spring实现事务的基本原理。为实现这个目标我想按以下几个步骤进行: 讲解事务中的一些基本概念使用Sp…

x-cmd pkg | jq - 命令行 JSON 处理器

目录 简介首次用户功能特点类似工具进一步探索 简介 jq 是轻量级的 JSON 处理工具,由 Stephen Dolan 于 2012 年使用 C 语言开发。 它的功能极为强大,语法简洁,可以灵活高效地完成从 JSON 数据中提取特定字段、过滤和排序数据、执行复杂的转…

Java NIO (三)NIO Channel类

1 概述 前面提到,Java NIO中一个socket连接使用一个Channel来表示。从更广泛的层面来说,一个通道可以表示一个底层的文件描述符,例如硬件设备、文件、网络连接等。然而,远不止如此,Java NIO的通道可以更加细化。例如&a…

在react中说说对受控组件和非受控组件的理解?以及应用场景

在react中说说对受控组件和非受控组件的理解?以及应用场景 回答思路:说说受控组件-->说说非受控组件-->应用场景受控组件:非受控组件应用场景 回答思路:说说受控组件–>说说非受控组件–>应用场景 受控组件&#xff…

【GitHub项目推荐--GitHub 上的考研神器】【转载】

如果有打算考研的读者,这些开源项目不能错过。把各个学校近几年考研初试真题分享给大家(包括 408),应该能帮上大家,文末有下载方式。 同时,我把盘点的开源相关的学习项目更新到 Awesome GiHub Repo&#xf…

YOLOv8改进 | Conv篇 | 2024.1月最新成果可变形卷积DCNv4(全网独家首发,附详细教程)

一、本文介绍 本文给大家带来的改进机制是2024-1月的最新成果DCNv4,其是DCNv3的升级版本,效果可以说是在目前的卷积中名列前茅了,同时该卷积具有轻量化的效果!一个DCNv4参数量下降越15Wparameters左右,。它主要通过两个方面对前一版本DCNv3进行改进:首先,它移除了空间聚…

在 Windows 操作系统上安装和配置 Flutter 开发环境

在 Windows 操作系统上安装和配置 Flutter 开发环境 系统配置要求 为了成功安装和运行 Flutter,确保您的开发环境满足以下基本需求: 操作系统:Windows 7 SP1 或更高版本。处理器:支持 64 位的架构。磁盘空间:至少预留…

【GitHub项目推荐--智能家居项目】【转载】

如果你具备硬件、软件知识,这个项目肯定符合你的胃口。 物美智能是一套软硬件结合的开源项目,该系统可助你快速搭建自己的智能家居系统。你可以学习到设备的集成和软硬件交互。 PC 端或者手机与服务端通信,单片机可以接受遥控设备和服务器的…

什么是DNS隐蔽信道?如何防御?

DNS隐蔽信道是一种利用域名系统(Domain Name System,DNS)进行数据传输的技术,它可以在不引起用户和网络安全系统注意的情况下,通过DNS查询和响应传输信息。由于DNS协议的设计初衷是为了解析域名到IP地址的映射,它通常不被视为用于传输大量数据的协议。然而,攻击者可以滥…

硬件-11-服务器的基础知识

参考服务器基础知识大科普 1 电视剧背景 服务器被誉为互联网之魂。 电视剧《创业年代》是一部有冯绍峰和袁姗姗等人联手主演的一部讲述我国第一批科技创业者创业故事的电视剧,可以说是他们铲下了建设中关村的第一捧土。 电视剧《创业年代》中的潮信公司并没有…

【神经网络】火箭点火发射-诠释一场数据与学习的奇妙之旅

火箭点火发射来理解神经网络的故事细节 在一个充满科技气息的研究室里,一群科学家们正在忙碌地准备着一次重要的火箭点火发射。这次发射不仅是一次航天探索的壮丽征程,更是一场利用神经网络处理数据的智慧之旅。 在火箭发射的背后,神经网络…

中仕教育:研究生毕业可以考选调生吗?

选调生的报考条件之一是应届生,研究生毕业也属于应届生,所以是可以报考的。 选调生不同学历的年龄限制: 1.应届本科生:年龄在25岁以内 2.应届研究生:年龄在30岁以内 3.应届博士生:年龄在35岁以内 研究…

for...in、for...of、for...Each的详细区别!

for...in for...in 语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。 仅迭代自身的属性 如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属…

excel统计分析——Tukey法多重比较

参考资料:生物统计学 https://real-statistics.com/one-way-analysis-of-variance-anova/unplanned-comparisons/tukey-hsd/ Tukey法是基于学生化极差分布计算最小显著极差(LSR),根据平均数个数调整最小显著极差。 LSR&#xff1…

Steam++(Watt Toolkit)加速GitHub失效特殊情况

github无法访问有很多情况,网上已经有很多解决方法,这里说一种特殊情况 如果你满足下列条件: 1、使用过Steam(Watt Toolkit)加速GitHub; 2、某天突然发现Steam(Watt Toolkit)对GitH…

LINUX常用工具之sudo权限控制

一、Sudo基本介绍 sudo是Linux 中用于允许特定用户以超级用户或其他特权用户的身份执行特定的命令或任务。sudo 提供了一种安全的方法,使用户能够临时获取额外的权限,而不需要以完全超级用户的身份登录系统。sudo也可以用了设置黑名单命令清单&#xff…

ROS第 13 课 TF 坐标系广播与监听的编程 实现

文章目录 第 13 课 TF 坐标系广播与监听的编程 实现1.机器人的坐标变换2.创建功能包3.编程方法3.1 编写广播和监听程序3.2 运行程序 第 13 课 TF 坐标系广播与监听的编程 实现 1.机器人的坐标变换 在进行编程前,先需要了解机器人的坐标变换。这里以运行海龟案例来…

体验开源香山高性能开源 RISC-V 处理器

整体架构设计 香山处理器是乱序六发射结构设计,目前支持 RV64GCBK 扩展。香山处理器前端流水线包括分支预测单元、取指单元、指令缓冲等单元,顺序取指。后端包括译码、重命名、重定序缓冲、保留站、整型/浮点寄存器堆、整型/浮点运算单元。 doc https…

有关软件测试的,任何时间都可以,软件测试主要服务项目:测试用例 报告 计划

有关软件测试的,任何时间都可以,软件测试主要服务项目: 1. 测试用例 2. 测试报告 3. 测试计划 4. 白盒测试 5. 黑盒测试 6. 接口测试 7.自动…

Vuex的基础使用

在使用之前要先了解Vuex的组成结构,跟对应的使用关系。 在上图的结构图中可以看到四个组成部分,首先是Components(组件)、Actions(行动)、Mutations(变化)、state(状态/数…