流畅的python笔记(九)符合python风格的对象

Python向量处理库:vector2d.py快速安装与应用指南 在现代计算机科学与数学应用中,向量处理库扮演着极其重要的角色。它提供了对向量进行创建、操作和计算的工具。是一个广泛使用的向量处理库,该版本支持Python3,且没有任何特定平台的依赖,非常适合于需要跨平台兼容性的项目。作为一款功能强大的库,它允许开发者以简洁直观的方式进行向量计算。无论是简单的点到点距离计算,还是复杂的向量空间变换,vector2d.py 都能够提供高效的解决方案。它的接口设计旨在最大化易用性和效率,无需深入理解底层实现细节。 阅读详情

目录

前言

一、对象表示形式

二、再谈向量类

三、备选构造方法

四、classmethod与staticmethod

五、格式化显示

六、让Vector2d可散列

七、python的私有属性和”受保护“属性

八、使用__slots__类属性节省空间

定义类属性__slots__

使用__slots__的问题

九、覆盖类属性


前言

本章接续第一章,说明如何实现很多python类型中常见的特殊方法。包含以下话题:

  • 支持用于生成对象其他表示形式的内置函数(repr()、byte()等)
  • 使用一个类方法实现备选构造方法
  • 扩展内置的format()函数和str.format()方法使用的格式微语言
  • 实现只读属性
  • 把对象变成可散列的,以便在集合中以及作为dict的键使用
  • 利用__slots__节省内存

一、对象表示形式

每种面向对象语言都至少有一种获取对象的字符串表示形式的标准方式,python中有两种方式:

  1. repr()。便于开发者理解的方式返回对象的表示形式,即要求准确表示出构造该对象时的信息。
  2. str()。便于用户理解的方式返回对象的字符串表示形式,因为某些类对象是用来给用户看的,比如一个time类,返回形式是 年-月-日-小时明显比返回类名属性方法更好看。

以上两种内置函数底层会调用__repr__和__str__特殊方法来进行支持。

        python对象还有两种方式返回表示形式:

  1. bytes(),底层是__bytes__,获取对象的字节序列表示形式。
  2. format()与str.format(),底层是__format__方法,使用特殊的格式代码显示对象的字符串表示形式。

二、再谈向量类

自定义二维向量Vector2d类,要求其基本行为如下:

  1.  Vector2d实例的分量可以通过属性直接访问。
  2.  Vector2d实例可以拆包成元组。
  3.  把Vector2d实例传入repr函数并调用,得到的结果类似于函数构造的源码。
  4. 使用eval克隆对象,传入Vector2d实例的repr函数返回结果,验证repr函数返回的是Vector2d实例的构造方法的准确描述。
  5. Vector2d实例支持使用 == 比较,这样便于测试。
  6. print函数会调用str函数,对Vector2d来说,输出一个有序对。
  7. bytes函数会调用__bytes__方法,生成实例的二进制表示形式(即字节序列表示形式)。
  8. abs函数会调用__abs__方法,返回Vector2d实例的模。
  9. bool函数会调用__bool__方法,如果Vector2d实例的模为零,返回False,否则返回True。

以下示例是当前定义的Vector2d类:

from array import array
import math

class Vector2d:
    typecode = 'd' # 类属性,在Vector2d实例与字节序列转换时使用,使用8字节双精度浮点数表示向量的各个分量

    def __init__(self, x, y):
        self.x = float(x) # 构造时把传入参数都转换成浮点数
        self.y = float(y)

    def __iter__(self):
        return (i for i in(self.x, self.y)) # 定义__iter__方法,把Vector2d实例变成可迭代对象,这样才能拆包,这里实现方式是直接调用生成器表达式一个一个产出分量

    def __repr__(self):
        class_name = type(self).__name__
        return '{}({!r}, {!r})'.format(class_name, *self) 

    def __str__(self):
        return str(tuple(self)) # 用可迭代对象可以轻松生成一个元组,然后显示出来

    def __bytes__(self):
        return (bytes([ord(self.typecode)]) # 为了生成字节序列,先把typecode转换成字节序列
                + bytes(array(self.typecode, self))) # 用类型码和可迭代对象构建一个数组,然后把数组转换成字节序列

    def __eq__(self, other):
        return tuple(self) == tuple(other) # 先把Vector2d类转换成元组(可迭代对象都可这样转换),然后比较值的相等性,这样做会有一点问题,因为只要other是可迭代对象且只有两个元素,都可以与Vector2d实例比较,即Vector(3, 4) == [3, 4] 的结果为True。
    def __abs__(self):
        return math.hypot(self.x, self.y) # 求模

    def __bool__(self):
        return bool(abs(self)) # abs计算模,然后求布尔值

三、备选构造方法

我们已经可以把Vector2d的实例转换成字节序列了,也应该能从字节序列转换成Vector2d实例。比如array.array就有个类方法.frombytes可以实现从字节序列到对象的转换。下面为Vector2d定义一个同名的frombytes方法,来实现从字节序列到Vector2d对象。

@classmethod # 装饰器
def frombytes(cls, cotets): # 不用传入self函数,而是通过cls传入类本身,因为是类方法
    typecode = chr(octets[0]) # 从第一个字节中读取typecode,chr返回当前整数(可以是任何进制)对应的ascii字符
    memv = memoryview(octets[1:]).cast(typecode) # 使用传入的octets字节序列创建一个memoryview,然后使用typecode转换(此时typecode是字符 'd',相当把内存内容变成了一个浮点数类型的memoryview对象)
    return cls(*memv) # 拆包memoryview对象(此时是以float的形式看待这段内存),得到构造方法所需的参数,构造出Vector2d对象

四、classmethod与staticmethod

  • classmethod:定义类方法,用来操作类,其第一个参数一定是类本身,一般这个参数命名为cls(但实际上随便取个名就可以)。常见用户是定义备选构造方法。
  • staticmethod:定义静态方法,静态方法就是普通的函数,只不过写在类里,由类名来调用,即只是简单地将静态方法储存在类的命名空间中。

下面示例中,类方法与静态方法的返回值都是其参数列表,可以看到,对于类方法,即使我们不传入参数,其也默认由Demo类作为第一个参数,且不管传不传参数,Demo类都是第一个参数。而静态方法则就是个由类名调用的普通函数,本书作者认为staticmethod用处不大。

五、格式化显示

内置format()函数和str.format()方法把格式化方式委托给 .__format__(format_spec)方法。format_spec是格式说明符(格式说明符使用的表示法叫格式规范微语言),其位置于:

  • format(my_obj, format_spec)的第二个参数
  • str.formar()方法的格式字符串中,{}里冒号后边的部分

  1. 格式说明符是 ‘0.4f’,保留4位小数。
  2. 格式说明符是{ }中 : 后边的0.2f,保留2位小数。

其中在str.format的用法中,{rate:0.2f} 与format(rate=brl)对应,以冒号和逗号分隔,冒号左边对应等号左边,冒号右边则用来格式化等号右边。冒号左边与等号左边是字段名,名字取什么无所谓但必须相等,甚至冒号左边和等号左边都可以没有,像下边这种用法也是可以的。

brl = 1 / 2.43
print(brl)
print(format(brl, '0.4f'))
print('1 BRL = {:0.2f} USD'.format(brl))

格式规范微语言为一些内置类型提供专用标识代码。b和x分别标识二进制和十六进制的int类型,f表示小数形式的float类型,而%表示百分数形式。

格式规范微语言可扩展,各个类可自行决定如何解释format_spec参数。例如,datatime模块中的类,他们的__format__方法使用的格式代码与strftime()函数一样。

from datetime import date, datetime
now = datetime.now()
print(format(now, '%H:%M:%S'))
print("It's now {:%I:%M %p}".format(now))

 

  •  %H应该是二十四小时制的当前时针数,%I代表十二小时制当前时针数
  •  %M是当前分针数
  •  %S是当前秒针数
  •  %p代表PM

如果自定义类没有定义__format__方法,从object继承的方法会返回str(my_object),上边Vector2d定义了__str__方法,因此使用fotmat时如下(当然,不用格式字符串):

如果传入格式字符串则会抛出TypeError。我们可以实现自己的微语言来解决这个问题。假设我们用格式说明符来格式化向量中各个浮点数分量,目的是达成以下效果:

实现方法如下:

  1. 因为Vector2d实现了__iter__方法,因此是可迭代的对象,这里用生成器表达式生成了一个生成器对象components,其中的元素是把fmt_spec应用到Vector2d对象迭代得到的每个分量上。
  2. 用生成器对象的两个元素分别代入到两个{}中去,得到最终返回形式(x, y)

这里我们的format方法并没有设置如何用格式控制符,实际上只需要通过fmt_spec格式字符串来判断就行了,暂不举例。

六、让Vector2d可散列

如果实现了一个类的__eq__方法,并且希望它是可散列的,那么它一定要有一个恰当的__hash__方法,保证在a == b为真的时候hash(a) == hash(b)也必定为真。目前的Vector2d实例是不可散列的,因此不能放入集合中。

        为了让Vector2d可散列,要做两件事,一是实现__hash__方法,二是让其不可变(为了实现__hash__方法),即Vector2d的两个分量要设置成只读类型。

        以下代码把Vector2d变成不可变的。

  1.  使用两个前导下划线(尾部没有下划线或只有一个),把属性标记为私有的(外界无法访问)。
  2. @property装饰器用来将一个方法变成一个相同名称的只读属性,然后就可以将方法x当成属性来访问了。
  3. 读值方法设置为x,因此不能直接my_obj.__x,但是可以my_obj.x来访问属性。
  4. 如3,返回self.__x的值。
  5. 同读值方法x。

        以下代码实现__hash__方法,一般建议使用位异或来混合各分量的散列值:

从__hash__方法的实现也可以看出,为什么我们要让Vector2d的两个分量不可变,因为我们还要用它们计算哈希值,而对象可散列要求其哈希值不能变。

        以上,Vector2d的对象就变成可散列的了。

七、python的私有属性和”受保护“属性

python中属性前加两个下划线即变成私有属性,但实际上python中并没有真正意义上的私有属性,而是用了一种叫名称改写的语言特性。即将类A的属性__x实际存储为 _A__x。

        如下代码是能够正常打印的。

class A:
    def __init__(self, x) -> None:
        self.__x = x
a = A(5)

print(a._A__x)

虽然很多程序员约定使用单下划线的属性为私有,不要在类外部访问,但是python解释器并不会对单下划线属性进行特殊处理。也有人称单下划线属性为“受保护的”属性。

        以上,我们可以看出,我们实现的Vector2d类并不能真正拥有私有的和不可变的分量。

八、使用__slots__类属性节省空间

定义类属性__slots__

默认情况下,python中实例属性__dict__字典要用存储所有的实例属性。字典的底层是散列表,散列表存储元素时由于要尽量散开,因此字典会消耗大量内存,如果实例很多(但实例的属性不多),则内存消耗巨大,通过__slots__类属性,能节省大量内存,方法是让解释器在元组(这也是为什么要求单个实例中属性不多,属性多了用元组查询就不方便了)中存储实例属性,而不用字典。

定义__slots__的方式是:创建一个名为__slots__的类属性,其值设为一个字符串构成的可迭代对象,各个元素表示各个实例属性。常使用元组,这样定义的__slots__中所含的信息不会变化。

 

使用__slots__的问题

  1. 每个子类都要定义__slots__属性,因为解释器会忽略继承的__slots__属性
  2. 实例只能拥有__slots__中列出的属性
  3. 把 ‘__dict__’加入 __slots__可以实现动态添加属性,但是不要这样做,这样会导致常规的__dict__即字典中存储实例,这就与__slots__目标背道而驰了。
  4. 如果不把'__weakref__'加入__slots__,实例就不能作为弱引用的目标/所指对象。

 

九、覆盖类属性

python独有特性:

  1. 类属性可用于为实例属性提供默认值。Vector2d中有个typecode类属性类属性,__bytes__方法用到的时候直接使用self.typecode读取它的值,因为实例没有这个属性,所以默认读取的是Vector2d.typecode类属性的值。
  2. 实例属性覆盖同名类属性,如果我们给不存在的实例属性self.typecode赋新值,则会新键一个实例属性(要动态添加自定义实例属性则不能使用__slots__优化),以后再用self.typecode读取的时候读取的是实例属性的值而非类属性。
  3. 如果想要修改类属性的值,必须直接在类上修改,不能通过实例修改。
  4. 有种修改类属性的方法更pythonic,因为类属性是公开的,因此会被子类继承,所以可以创建一个子类,专门用于定制类属性,用这个子类来实例化对象。

FreeRTOS OTA实战:从Bootloader设计到安全升级的完整流程(附MQTT示例代码) 本文详细介绍了在FreeRTOS系统中实现安全OTA固件升级的完整流程。内容涵盖从Bootloader设计、存储分区规划到与MQTT协议集成的OTA Agent任务开发,并重点解析了固件签名验证、防回滚等关键安全机制,为嵌入式物联网设备提供了一套高可靠性的远程升级解决方案。 阅读详情

相关推荐

关于LIO-SAM编译时出现错误 /usr/bin/ld: 找不到 -lBoost::timer

关于LIO-SAM编译时出现错误: 下载LIO-SAM代码 进入LIO-SAM文件夹,通过以下代码编译: mkdir build cd build cmake .. make 报错: /usr/bin/ld: 找不到 -lBoost::timer collect2: error: ld returned 1 exit status CMakeFiles/lio_sam_imuPreintegration.dir/build.make:759: recipe for target 'devel/lib/li

wwtx的博客 3648

Python编程:符合Python风格的对象

Python进阶经典教程!

weixin_56051592的博客 306

DEXPI与Proteus XML:解锁过程工业P&ID数据互操作性的技术核心

本文深入探讨了DEXPI与Proteus XML在过程工业P&ID数据互操作性中的核心技术。通过解析DEXPI标准的开源特性和Proteus XML的架构设计,揭示了其在跨平台数据交换中的关键作用,并结合CADMATIC和西门子COMOS的实战案例,展示了如何实现高效的数据集成与转换。

weixin_29195615的博客 383

python静态方法学习--二维列表工具

""" 二维列表工具 """ class Vector2: """ 向量 """ def __init__(self, x=0, y=0): self.x = x self.y = y # 将函数转移到类中,就是静态方法. @staticmethod def right(): return Vector2(0, 1) @staticmethod def up().

shuangrongshipin的博客 1016

实验三 Gmapping建图

自主移动机器人第三次实验课,内容包括:(1)turtlebot的gmapping建图;(2)rosbag的使用;(3)gazebo中的gmapping建图。

lj164567487的博客 4647

【数据分享】1985-2023年30米CLCD土地覆盖栅格数据分享

总的来说,CLCD 反映了中国快速的城市化进程和一系列生态工程,揭示了气候变化条件下人为对 LC的影响,其在全球变化研究中具有潜在应用价值。最后,通过目视解译的独立样本和第三方测试样本评估CLCD的准确性。特别地,该研究将CLCD产品与目前最先进的30m专题产品包括不透水表面积(ISA)、地表水和森林进行比对,以综合评估CLCD的质量(以下为技术流程图)。数据分类:分为九类用地,该数据包括9种用地类型,分别为:农田、森林、灌木、草原、水域、冰雪、裸地、不透水面、湿地。数据格式:.tif格式。

weixin_61129400的博客 6915

Python 部分特殊方法的使用

__iter__,__repr__,__str__,__bytes__,__format__等方法的使用

weixin_42817311的博客 910

SARScape实战:集成GACOS数据优化InSAR大气校正全流程

本文详细介绍了如何在SARScape软件中集成GACOS数据,以优化InSAR大气校正的全流程。通过实战步骤,从GACOS数据申请、下载、导入,到在单景干涉图和SBAS-InSAR流程中应用,有效剥离大气相位延迟,显著提升形变监测结果的精度与可靠性,实现从“雾里看花”到“拨云见日”的转变。

weixin_28419039的博客 397

用Python和Pygame写游戏-从入门到精通(9) Vector2d

1、Vector2d import math class Vector2(object): def __init__(self, x = 0.0, y = 0.0): self.x = x self.y = y def __str__(self): return "(%s, %s)" % (self.x, self.y)

u012568278的博客 3120

某瓜数据app 获取达人直播商品信息接口 Sign

某瓜数据app 获取达人直播商品列表接口 Sign

自成背后的博客 6038

ICME 2026 即插即用 | 特征增强篇 | FSD:多尺度小波分解+频域特征融合,结构细节纹理均增强,性能猛涨!

本文提出了一种基于频域结构解耦和区域感知融合的双路径学习框架(FSD),用于低光图像超分辨率任务。该框架通过多尺度小波变换将输入图像分解为低频亮度结构和高频纹理细节两个正交分量,并采用双路径网络分别处理这两个分量,最后通过跨频段语义重组模块实现特征融合。实验表明,FSD模块在多项指标上显著优于现有方法,能有效提升图像的结构自然度和细节清晰度。该模块适用于对频域/结构/纹理敏感的视觉任务,可直接嵌入网络实现端到端训练。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 138

流畅的Python笔记

比如,要存放 1000 万个浮点数的话,数组(array)的效率要高得多,因为数组在背后存的并不是 float 对象,而是数字的机器翻译,也就是字节表述。构造方法或 [:] 做的是浅复制(即复制了最外层容器,副本中的元素是源容器中元素的引用)。综上,闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。注意,一般来说,深复制不是件简单的事。其实,闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。

ccnuacmhdu的博客 1085

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

《流畅的Python》读书笔记——符合Python风格的对象

对象表示形式 所谓对象表示形式,就是将对象转换为一种可读的形式。 Python提供了两种方式: repr():以便于开发者理解的方式返回对象的字符串表示形式 str():以便于用户理解的方式返回对象的字符串表示形式 我们只要实现 __repr__ 和__str__ 特殊方法,就可以为repr() 和str() 提供支持。 为了给对象提供其他的表示形式,还会用到另外两个特殊方 法:__bytes...

日积月累,天道酬勤 587

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

流畅的Python: 符合Python风格的对象

符合Python风格的对象 文章目录符合Python风格的对象1. 对象表示形式2. 向量类的示例:3. classmethod与staticmethod4. 格式化显示5. 可散列的Vector2d6. Python的私有属性和“受保护的”属性7. 使用`__slot__ `类属性节省空间8. 覆盖类属性 1. 对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式。P...

随心写写 304

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

流畅的python 符合python风格的对象

对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式。Python 提供了两种方式。repr()  以便于开发者理解的方式返回对象的字符串表示形式。str()  以便于用户理解的方式返回对象的字符串表示形式。正如你所知,我们要实现 __repr__ 和 __str__ 特殊方法,为 repr()和 str() 提供支持。为了给对象提供其他的表示形式,还会用到另...

dianshuochi1092的博客 459

流畅的Python——符合Python风格的对象

符合Python风格的对象

fatfairyyy的博客 301

[流畅的Python][9][符合Python风格的对象]

第9章 符合Python风格的对象 绝对不要使用两个前导下划线,这是很烦人的自私行为—Ian Bicking 得益于Python数据模型,自定义类型的行为可以像内置类型那样自然 实现如此自然的行为,靠的不是继承,而是鸭子类型:我们只需按照行为实现对象所需的方法即可 9.1 对象的表示形式 Python提供两种获取对象的字符...

T0UGH 149

流畅的Python(九)-符合Python风格的对象

3.扩展内置的format()函数和str.format()方法使用的。接续第一章,说明如何实现很多Python类型中常见的特殊方法。5.把对象变成可散列的,以便在集合中作为dict的键使用。1. 支持使用生成对象其他表示形式的。(如repr(),bytes()等)6.利用__slots__节省内存。2. 使用类方法,实现。

weixin_37901366的博客 510

流畅的python:符合Python风格的对象-Part1

符合Python风格的对象 1、对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式。Python提供了两种方式。 repr()以便于开发者理解的方式返回对象的字符串表示形式。 str()以便于用户理解的方式返回对象的字符串表示形式。 前面我们也已经讲过,两者的内部实现是通过__repr__和__str__特殊方法。 除此之外还会用到另外两个特殊方法:__bytes__和__format__。__bytes__方法与__str__方法类似:bytes()函数调用它获取对

Murphy_31的博客 268

流畅的Python读书笔记-第九章-符合Python风格的对象

fluent python读书笔记

pku_langzi的博客 451

符合Python风格的对象

文章目录符合Python风格的对象1.1 前言1.2 实现向量类1.3 classmethod与staticmethod1.4 格式化显示1.5 实现自定义类的可散列 符合Python风格的对象 1.1 前言 本文是《流畅的Python》——符合Python风格的对象的读后笔记与总结。 在其他面向语言中构建自定义类型通常是通过继承和重载来实现,然而在Python中只要构建鸭子类型就可以实现自定义类型:只需按照预定行为实现对象所需的方法即可。 Python中有很多的魔法方法,这是Python语言的魅力之一,通

奔跑的蜗牛的博客 276

第9章 符合Python风格的对象

1 #《流畅的Python》读书笔记 2 # 第9章 符合Python风格的对象 3 # 本章包含以下话题: 4 # 支持用于生成对象其他表示形式的内置函数(如repr()、bytes(),等等) 5 # 使用一个类方法实现备选构造方法 6 # 扩展内置的 format() 函数和 str.format() 方法使用的格式微语言 ...

weixin_30745553的博客 107

《流畅的python》学习笔记及书评

《流畅的python》学习笔记 文章目录《流畅的python》学习笔记写在前面1. Python数据模型1.1 特殊方法2. 序列构成的数组2.1 内置序列类型2.2 列表推导和生成器表达式2.3 元组不仅仅是不可变的列表2.4 切片2.5 增量赋值2.6 排序2.7 数组、内存视图、NumPy和队列3. 字典和集合3.1 泛映射类型和字典推导3.2 常见的映射方法3.3 映射的弹性键查询3.4 字典的变种3.5 集合3.6 dict和set的背后4. 文本和字节序列4.1 字符和字节4.2 编码和解码4.

李英俊小朋友 2463

《流畅的Python》读书笔记12: 第三部分 类和协议 - 符合 Python 风格的对象

流畅的 Python》第 11 章(第一版第 9 章)聚焦于如何创建**“Pythonic”的对象**——即行为符合 Python 语言惯用风格的自定义类。Python 的对象模型通过特殊方法(__repr____eq____hash__等)让用户定义的类能够与语言的核心特性无缝集成。良好的对象字符串表示(__repr____str____format__完整的比较运算符(__eq__及通过辅助)哈希化(__hash__)使对象可作字典键私有属性和保护属性的命名约定@property。

3226

读书笔记:《流畅的Python》第9章 符合Python风格的对象

# 第九章 符合python风格的对象 """ 鸭子类型(duck typing): 一个动物只要走起路来像鸭子,叫起来像鸭子,那么我就说它是鸭子 一个对象只要按照预定行为实现了对象所需的方法即可 """ """ 内容提要: 1.支持用于生成对象其他表示形式的内置函数repr/bytes 2.使用一个类方法实现备选构造方法 3.扩展内置的format()函数和str.format()方法使用的格式微语言 4.实现只读属性 5.把对象变为可散列的 .

Morbidmuse的博客 770

流畅的python-学习笔记_符合python风格的对象

查看对象说明,可以通过__repr__和__str__方法,前者主要用于开发者,后者主要用于用户,这两个方法分别对内置函数repr和str函数提供支持。

peter6768的博客 445
上一篇: 流畅的python笔记(八)对象引用、可变性和垃圾回收
下一篇: 流畅的python笔记(十)序列的修改、散列和切片
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值