学习python类的构造

目录

1、Object类

2、初始化方法

3、双下划线方法

4、传递参数

5、装饰器

6、assert

7、yield关键字


1、Object类

class NodeBase(object):
  • 在Python中,Object是所有其他类的基类。换句话说,所有的类都是Object类的子类。Object类定义了所有对象的基本行为和属性。
  • Object类定义了以下的一些方法:
  • init: 这是一个特殊的方法,在创建新对象时自动调用。它是用来初始化新创建的对象的状态的。
  • del: 这是一个特殊的方法,当一个对象被垃圾收集器回收时自动调用。它通常用于清理资源,如关闭文件或网络连接。
  • str 和 repr: 这两个方法都用于返回对象的字符串表示。它们的主要区别在于,如果可能,str()应该返回一个人类可读的字符串,而repr()应该返回一个可以用来复现该对象的字符串。
  • eq 和 ne: 这两个方法用于比较两个对象是否相等。它们的行为由类的实现决定。
  • lt, le, gt, ge: 这些方法用于比较两个对象。它们的行为由类的实现决定。
  • call: 这是一个特殊的方法,可以在对象上调用。它通常用于模拟函数调用。
  • hash: 这个方法返回一个整数,该整数可以被用作哈希值。它通常由不可变类型(如整数、浮点数、字符串和元组)的实现覆写。
  • bool: 这个方法返回一个布尔值,该值表示对象是否被视为真值。它通常由有意义的值(如非零的数字或非空的字符串或列表)的实现覆写。

2、初始化方法

def __init__(self,*coord):self.init_coord(*coord)self._ID = Noneself._nAk = Noneself._nBk = Noneself.init_keys()
  • def __init__(self,*coord): 这是类的初始化方法,当你创建这个类的一个实例时,这个方法会被调用。self 是对实例自身的引用,*coord 是一个可变参数,可以接收任意数量的参数。
  • self.init_coord(*coord): 这行代码调用了一个名为 init_coord 的方法,并将 *coord 参数传递给它。这可能是用来初始化坐标或其他相关数据的。
  • self._ID = None: 这行代码为实例的 _ID 属性赋值为 None。这是一个私有属性,以单下划线前缀表示。
  • self._nAk = None 和 self._nBk = None: 这两行代码分别为实例的 _nAk 和 _nBk 属性赋值为 None。这两个也是私有属性。
  • self.init_keys(): 这行代码调用了一个名为 init_keys 的方法,可能是用来初始化键或相关数据的。

在Python中,*coord 和 **coord 都是在函数参数中使用的,表示对参数进行解包。

  • *coord 是用于解包列表或元组。当你传递一个列表或元组给一个函数,并且使用 * 前缀,Python会把这个列表或元组解包为单独的参数。例如:

def sum_numbers(*coord):  return sum(coord)  numbers = [1, 2, 3, 4, 5]  
result = sum_numbers(*numbers)  # 这等价于 sum_numbers(1, 2, 3, 4, 5)  
print(result)  # 输出:15
  • **coord 是用于解包字典。当你传递一个字典给一个函数,并且使用 ** 前缀,Python会把这个字典解包为单独的关键字参数。例如:

def print_dict(**coord):  print(coord)  my_dict = {"name": "Alice", "age": 25}  
print_dict(**my_dict)  # 这等价于 print_dict(name="Alice", age=25)

3、双下划线方法

        def __repr__(self):return "Node:%r"%(self.coord,)def __getitem__(self,key):return self.coord[key]

在Python中,双下划线开头的函数(如__repr__)被称为特殊方法或双下划线方法。这些方法在Python中具有特殊的意义和用途。__repr__方法就是其中之一。

__repr__是一个内置方法,用于返回一个对象的字符串表示。这个方法的目的是让对象可以被准确地、无歧义地重新创建。通常,__repr__应该返回一个字符串,这个字符串包含了一个可以用来复制对象的Python表达式。

例如,如果你有一个名为Person的类,它有一些属性如nameage,你可以这样定义__repr__方法:

class Person:  def __init__(self, name, age):  self.name = name  self.age = age  def __repr__(self):  return f"Person('{self.name}', {self.age})"
person = Person('Alice', 25)  
print(person)  # 输出:Person('Alice', 25)

4、传递参数

def init_coord(self,*coord):self._x = 0.self._y = 0.self._z = 0.if len(coord) == 1:self.dim = len(coord[0])if self.dim == 2:self._x = coord[0][0]*1.self._y = coord[0][1]*1.self.coord = (self.x,self.y)elif self.dim == 3:self._x = coord[0][0]*1.self._y = coord[0][1]*1.self._z = coord[0][2]*1.self.coord = (self.x,self.y,self.z)else:raise AttributeError("Node dimension is 2 or 3")elif len(coord) == 2:self.coord = tuple(coord)self.dim = 2self._x = coord[0]*1.self._y = coord[1]*1.self.coord = (self.x,self.y)elif len(coord) == 3:self.coord = tuple(coord)self.dim = 3self._x = coord[0]*1.self._y = coord[1]*1.self._z = coord[2]*1.self.coord = (self.x,self.y,self.z)else:raise AttributeError("Node dimension is 2 or 3")

这段代码是定义了一个对象的三个私有属性:_x, _y, _z,并设置了对象的一个公有属性coord。方法接收一个或多个参数,并根据参数的数量和类型设置属性的值,可以是列表list、元组tuple或numpy.ndarray类型。

5、装饰器

@propertydef nBk(self):return self._nBk
  • @property:这是一个装饰器的语法,用于将下面的方法标记为一个属性。这意味着该方法可以在类实例上使用点表示法(即obj.nBk)来访问。
  • def nBk(self)::这是一个名为nBk的方法,它是一个属性的定义。该方法没有参数,并且返回一个值,这个值是通过return self._nBk得到的。
  • return self._nBk:这个语句返回self._nBk的值。在这里,self._nBk应该是该类的一个实例属性(即在实例创建时赋值的属性),它存储了真正的值。由于nBk方法是一个只读属性,所以它没有参数,并且不接受任何输入参数。
   @x.setterdef x(self,val):self._x = val
  • @x.setter:这是一个装饰器语法,用于定义一个名为x的setter方法。setter方法是用于设置对象属性的方法。在Python中,setter方法通常用于当您想要在更改属性的值时执行一些额外的操作,例如验证或记录日志。
  • def x(self, val)::这是定义的setter方法。它的名称是“x”,它是一个实例方法(因为它以self为第一个参数),并且它接受一个额外的参数val,这是我们要设置的新值。
  • self._x = val:这行代码是将新的值赋给属性_x。在Python中,通常使用下划线前缀来表示一个变量的名称是私有的,这意味着它应该在类的外部被隐藏,并且只能通过类内部的方法来访问。在这里,我们假设_x是这个类的私有属性,所以我们使用下划线前缀。
class Person:  def __init__(self, ID):  self._ID = ID  @ID.setter  def ID(self, val):  self._ID = val
p = Person(123)  
p.ID = 456  # 这里调用了setter方法,将_ID属性的值更改为456  
print(p._ID)  # 输出:456

6、assert

assert boolean_expression

assert boolean_expression, message

assert issubclass(type(nd),NodeBase),"Must be Node type"

这段代码是在一个类的初始化方法__init__中使用了一个断言语句assert。断言语句用于在运行时检查代码的正确性,如果条件不满足,则会引发一个异常。

在这段代码中,assert issubclass(type(nd),NodeBase),"Must be Node type"这行代码的含义是检查变量nd是否是NodeBase类或其子类的实例。如果不是,它将引发一个异常,异常信息为"Must be Node type"。

具体来说,type(nd)会返回变量nd的类型,issubclass(type(nd),NodeBase)会检查返回的类型是否是NodeBase类或其子类。如果是,返回True;否则返回False。如果issubclass返回False,即nd不是NodeBase类或其子类的实例,那么assert语句就会引发一个异常,异常信息为"Must be Node type"。

这种断言方式常常用于确保程序的正确性,避免程序在运行时出现不可预期的行为。

def zeros(s):a=int(s)assert a>0,"out range"return a
print(zeros(-1))

7、yield关键字

yield在函数中的功能类似于return,不同的是yield每次返回结果之后函数并没有退出,而是 每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。如果 一个函数需要多次循环执行一个动作,并且每次执行的结果都是需要的,这种场景很适合使用yield实现。

包含yield的函数成为一个生成器,生成器同时也是一个迭代器,支持通过next方法获取下一个值。

使用yield的好处是通过使用生成器,避免占用内存,提高运行效率。

def pair_wise(L,end = False):pool = tuple(L)n = len(pool)assert n >=2,"Length of iterable must greater than 3"           if end is True:indices = list(range(n))for i in indices:if i < n -1:yield (pool[i],pool[i+1])else:yield (pool[i],pool[0])if end is False:indices = list(range(n-1))for i in indices:yield (pool[i],pool[i+1])
a=[1,2,3,4]
for i in pair_wise(a,True):print(i)

(1, 2)

(2, 3)

(3, 4)

(4, 1)

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

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

相关文章

springboot基础配置及maven运行

目录 1、spring快速开始&#xff1a; 2、通过idea工具打开导入包 3、maven打包 1、springboot快速开始&#xff1a; 环境依赖&#xff1a;jdk17 Spring | Quickstart spring初始化包下载&#xff1a; 点击generate&#xff0c;下载包 2、通过idea工具打开导入包 我之前写了…

【Vulnhub靶机】lampiao--DirtyCow

文章目录 漏洞介绍简介原因类型版本危害 信息收集主机扫描端口扫描 漏洞探测漏洞利用权限提升nc文件传输编译 参考 靶机地址&#xff1a;lampiao 下载地址&#xff1a;Lampio: 1 漏洞介绍 简介 脏牛&#xff08;Dirty Cow&#xff09;是Linux内核的一个提权漏洞&#xff0c;…

【mybatis <sql>,<include>标签】

文章目录 <sql> 标签<include> 标签 <sql> 标签 <sql> 标签用于定义可重用的 SQL 片段&#xff0c;可以在多个地方引用。避免重复编写相同的 SQL 片段。 示例&#xff1a; 假设有一个 SQL 语句用于查询用户表中特定条件下的数据&#xff1a; <s…

Redis 通用命令和数据类型

get和set get和set两个命令是最基本也是最常用的命令&#xff0c;主要用于操作字符串类型的数据。 1.SET 命令: SET 命令用于设置指定 key 的值。如果 key 已经持有其他值&#xff0c;SET 就覆写旧值&#xff0c;无视类型。具体的命令格式如下&#xff1a; SET key value例如…

MySQL交集和差集的实现方法

文章目录 前言实现方式union all和union的区别后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&…

【Linux】tar 命令使用

tar 命令 tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 著者 由约翰吉尔摩和杰伊芬拉森撰写。 语法 tar [选项] [压缩后文…

【Vue】【uni-app】实现工单列表项详情页面

这次主要实现的是一个工单详情页面 从工单列表项中点击详情 跳转到工单详情页面&#xff0c;这个详情页面就是这次我们要实现的页面&#xff0c;并可以通过点击这个关闭按钮返回到工单列表页面 首先是在我们原有的工单列表页面的按钮增加一个点击跳转 <button size"m…

easyrecovery如何恢复手机数据及硬盘数据恢复方法

EasyRecovery16是一款优秀的数据恢复软件&#xff0c;不仅能够兼容windows和mac双重系统&#xff0c;同时还能够识别u盘、存储卡、手机等多种数据储存设备&#xff0c;可恢复的文件类型更是多达百余种。还贴心地准备个人版、专业版和企业版的下载&#xff0c;增加了用户的可选性…

QNX下多窗口叠加融合方案

目的&#xff1a;QNX下EGL多窗口叠加融合方案 环境&#xff1a; 系统&#xff1a;QNX 环境&#xff1a;8155/8295问题&#xff1a; EGL有时候在同一个进程中因为引入不同的功能&#xff0c;在不同的线程中进行窗口的绘制和融合&#xff0c;QNX下的融合方案&#xff0c;实测使…

scala可变参数列表使用

在Scala中&#xff0c;可以使用可变参数列表&#xff08;varargs&#xff09;来定义一个函数&#xff0c;以接受可变数量的参数。示例如下&#xff1a; def printArgs(args: String*): Unit {args.foreach(println) }// 使用可变参数列表 printArgs("Hello", "…

查看Linux是哪个发行版的

在 Linux 中&#xff0c;你可以使用几个不同的命令来查看系统是哪个发行版的。下面是一些常用的方法&#xff1a; 查看 /etc/*-release 文件: 这些文件包含了有关 Linux 发行版的信息。你可以使用 cat 命令来查看这些文件的内容&#xff1a; cat /etc/*-release这个命令会显示一…

open与openat的区别

Linux 中的 open 和 openat 系统调用都用于打开文件&#xff0c;但它们有一些区别。 一、函数原型 open 系统调用的原型 #include <fcntl.h>int open(const char *pathname, int flags, mode_t mode);pathname 是要打开的文件路径flags 是打开文件的标志mode 是文件的…

异常数据检测 | Python实现PCA和KMeans模型异常数据检测

文章概述 异常值检测(outlier)是一种数据挖掘过程,用于确定数据集中发现的异常值并确定其出现的详细信息。当前自动异常检测至关重要,因为大量数据无法手动标记异常值。自动异常检测具有广泛的应用,例如信用卡欺诈检测,系统健康监测,故障检测以及传感器网络中的事件检测…

前端开发_HTML

简介 CSS用于美化内容 HTML用于摆放内容 可以理解为HTML是基础&#xff0c;CSS是工具 HTML定义 HTML 超文本标记语言——HyperText Markup Language 超文本——链接 标记——标签&#xff0c;即带尖括号的文本 标签语法 双标签 开始标签&#xff1a; <xxx> 即尖…

点击元素以外的事件监听

在项目中&#xff0c;我们经常会遇到需要监听目标元素以外的区域被点击或鼠标移入移出等需求。 例如下面我们有一个表格里面嵌套表单的组件 我希望点击n行的时候&#xff0c;n行的元素变成表单元素进行输入或者选择&#xff0c; 当我点击其他其他区域n行又会恢复成数据展示…

WordPress插件大全-免费的WordPress插件汇总

随着互联网的不断发展&#xff0c;网站建设变得日益普及。对于大多数人而言&#xff0c;WordPress是一个熟悉且易于使用的网站建设平台。然而&#xff0c;有时候我们可能会觉得WordPress的功能还不够满足我们的需求&#xff0c;这时候&#xff0c;插件就成了解决问题的得力工具…

IMU传感器用于智能假肢

截肢会给截肢者们带来生活上的不方便和极大痛苦&#xff0c;因此假肢的优化一直被关注着。近期&#xff0c;一项关于新型智能膝关节的研究&#xff0c;让假肢能更好地模拟自然膝关节&#xff0c;给截肢者们带来了希望。 此款假肢内置IMU传感器&#xff0c;减少了截肢者所需的肌…

箭头函数与普通函数:谁更胜一筹?

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

MySQL分页查询方法及优化

文章目录 前言为什么要分页分页查询方法使用子查询优化使用 id 限定优化关于数据表的id说明后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正…