类的组合与继承

用COMSOL计算复合材料板频散曲线:从建模到绘图全流程 导波在板结构中传播时,不同频率成分的速度不同,即频散现象。理解频散曲线是识别导波模态、确定相速度与群速度的基础,也是无损检测和结构健康监测中信号解读的关键。对于碳纤维增强复合材料等各向异性板,频散关系更加复杂,传统解析方法难以求解,数值仿真成为主流手段。通过COMSOL结合周期性边界条件与特征频率扫描,可以高效计算出复合材料板的频散曲线,进而绘制相速度和群速度随频率变化的图谱,为实验模态识别、换能器激励频率选择提供依据。本文以一个2毫米单向碳纤维板为例,详细介绍几何建模、材料参数设置、网格收敛验证、参数扫描 阅读详情

在“对象与类”那篇博客中,我们定义了两个类,一个是person,一个是family;在family类中创建person类中的对象,把这个对象视为family类的一个属性,并调用它的方法处理问题,这种复用方法叫“组合”。还有一种复用方式,就是继承。

类与类之间有一种父与子的关系,子类继承父类的属性和方法,称为继承。在继承里,子类拥有父类的方法和属性,同事子类也可以有自己的方法和属性。

我们把那一篇博客中的组合代码用继承来实现,代码如下:

<?php
/**
 * Created by PhpStorm.
 * User: lightWay
 * Date: 2017/2/9
 * Time: 18:24
 */
class Person
{
    public $name = 'Tom';
    public $gender;
    static $money = 10000;

    public function __construct()
    {
        echo '这就是父类',PHP_EOL;
    }

    public function say()
    {
        echo $this->name,"\tis",$this->gender,"\r\n";
    }
}

class Family extends Person
{
    public $name;
    public $gender;
    public $age;
    static $money = 100000;

    public function __construct()
    {
        parent::__construct(); //调用父类的构造方法
        echo '这里是子类',PHP_EOL;
    }

    public function say()
    {
        parent::say();
        echo $this->name,"\tis\t",$this->gender,"and is\t",$this->age,PHP_EOL;
    }

    public function cry()
    {
        echo parent::$money,PHP_EOL;
        echo '%>_<%',PHP_EOL;
        echo self::$money,PHP_EOL;
        echo '(*^_^*)';
    }
}

$poor = new Family();
$poor->name = 'Lee';
$poor->gender = 'female';
$poor->age = 25;
$poor->say();
$poor->cry();
运行上面的代码,可以得到如下图所示的结果:



从上面代码中可以了解继承的实现。在继承中,用parent指代父类,用self指代自身。使用 “::” 运算符(范围解析操作符)调用父类的方法。“::” 操作符还用来作为类常量和静态方法的调用,不要把这两种应用混淆。

既然提到了静态,就需要强调一点,如果声明类成员或方法为static,就可以不实例化类而直接访问,同时也就不能通过一个对象访问其中的静态成员(静态方法除外),也不能用 “::” 访问一个非静态方法。比如,把上例中的$poor->cry();换成$poor::cry(),按照这个规律,应该是要报错的。可能试验时,并没有报错,而且能够正确输出。这是因为用“::”方式调用一个非静态方法会导致一个E_STRICT级别的错误,而这里的PHP设置默认没有开启这个级别的报错提示。打开PHP安装目录下的php.ini文件,设置如下:

error_reporting = E_ALL|E_STRICT
display_errors = On
再次运行,就会看到错误提示。因此,用 “::” 访问一个非静态方法不符合语法,但PHP仍然能够正确地执行代码,这只是PHP所做的一个“兼容”或者说“让步”。 在开发时,设置最严格的报错等级,在部署时可适当调低

组合与继承都是提高代码可重用性的手段。在设计对象模型时,可以按照语义识别类之间的组合关系和继承关系。比如,通过一些总结,得出了继承是一种“是、像”的关系,而组合是一种 “需要” 的关系。利用这条规律,就可以很简单地判断出父亲与儿子应该是继承关系,父亲与家庭应该是组合关系。还可以从另外一个角度看,组合偏重于整体与局部的关系,而继承偏重于父与子的关系,如下图所示:

从方法复用角度考虑,如果两个类具有很多相同的代码和方法,可以从这两个类中抽象出一个父类,提供公共方法,然后两个类作为子类,提供个性方法。这时用继承语意更好。继承的UML图如下图所示:


而组合就没有这么多限制。组合之间的类关系(体现为复用代码)很小,甚至没有关系,如下图所示:


然而在编程中,继承与组合的取舍旺旺并不是这么直接明了,很难说说二者是“像”的关系还是“需要”的关系,甚至把它拿到现实世界中建模,还是无法决定应该是继承还是组合。那应该怎么办呢?有什么标准码?的确有,这个标准就是“低耦合”。

耦合是一个软件结构内不同模块之间互连程度的度量,也就是不同模块之间的依赖关系。

低耦合指模块与模块之间,尽可能地使模块之间独立存在;模块与模块之间的接口尽量少而简单。现代的面向对象的思想不强调为真实世界建模,变得更理性化一些,把目标放到解耦上。

解耦是要解除模块与模块之间的依赖。

按照这个思想,继承与组合二者语义上难以区分,在二者均可使用的情况下,更倾向于使用组合。为什么呢?继承存在什么问题呢?

  1. 继承破坏封装性。

    比如,定义鸟类为父类,具有羽毛属性和飞翔方法,其子类天鹅、鸭子、鸵鸟等继承鸟这个类。显然,鸭子和鸵鸟不需要飞翔这个方法,但作为子类,他们却可以无区别地使用飞翔这个方法,显然破坏了类的封装性。而组合,从语义上来说,要优于继承。

  2. 继承是紧耦合的。

    继承使得子类和父类捆绑在一起。组合仅通过唯一接口和外部进行通信,耦合度要低于继承。

  3. 继承扩展复杂

    随着继承层数的增加和子类的增加,讲涉及及大量方法重写。使用组合,可以根据类型约束,实现动态组合,减少代码。

  4. 不恰当地使用继承可能违反现实世界中的逻辑。

    比如,人作为父类,雇员、经理、学生作为子类,可能存在这样的问题,经理一定是雇员,学生也可能是雇员,而使用继承的话,一个人就无法拥有多个角色。这种问题归结起来就是“角色”和“权限”问题。在权限系统中很可能存在这样的问题,经理权利和职位大于主管,但出于分工和安全的考虑,经理没有权限直接操作主管所负责的资源,技术部经理也没权限直接命令市场部主管。这就要求角色和权限几桶的设计要更灵活。不恰当的继承可能导致逻辑混乱,而使用组合就可以较好地解决这个问题。

当然,组合并非没有缺点。在创建组合对象时,组合需要一一创建局部对象,这一定程度上增加了一些代码,而继承则不需要这一步,因为子类自动有了父类的方法,代码如下所示:

<?php
/**
 * Created by PhpStorm.
 * User: lightWay
 * Date: 2017/2/10
 * Time: 16:16
 */
class Car
{
    public function addoil()
    {
        echo "Add oil \r\n";
    }
}

//继承实现
class Bmw extends Car
{

}

//组合实现
class Benz
{
    public $car;

    public function __construct()
    {
        $this->car = new Car();
    }

    public function addoil()
    {
        $this->car->addoil();
    }
}

$bmw = new Bmw();
$bmw->addoil();
$benz = new benz();
$benz->addoil();


显然,组合比继承增加了代码量。组合还有其他的一些缺点,不过总体来说,是优点大于缺点。

继承最大的有点事扩展简单,但是其缺点大于优点,所以在设计时,需要慎重考虑。那应该如何使用继承呢?

  • 精心设计专门用于被继承的类,继承树的抽象层应该比较稳定,一般不要多于三层。
  • 对于不是专门用于被继承的类,禁止其被继承,也就是使用final修饰符。使用final修饰符既可以防止重要方法被非法覆写,又能给编辑器寻找优化的机会。
  • 优先考虑用组合关系提高代码的可重用性。
  • 子类是一种特殊的类型,而不只是父类的一个角色。
  • 子类扩展,而不是覆盖或者使父类的功能失效。
  • 底层代码多用组合,顶层/业务层代码多用继承。底层用组合可以提高效率,避免臃肿。顶层代码用继承可以提高灵活性,让业务使用更方便。
继承并非一无是处,而组合也不是完美无缺的。如果既要组合的灵活,又要继承的简洁,可以做到吗?

当然可以,譬如多重继承,就具有这个特性。多重继承里一个类可以同时继承多个父类,组合两个父类的功能。C++里就是使用的这种模型来增强继承的灵活性的,但是多重继承过于灵活,并且会带来“菱形问题”,故为其使用带来了不少困难,模型变得复杂起来,因此在大多数语言中,都放弃了多重继承这一模型。

多重继承太复杂,那么还有其他方式能比较好地解决这个问题吗?PHP5.4引入的新的语法结构Traits就是一种很好的解决方案。Traits的思想来源于C++和Ruby里的Mixin以及Seala里的Traits,可以方便我们实现对象的扩展,是除extend、implement外的另外一种扩展对象的方式。Traits既可以使单继承模式的语言获得多重继承的灵活,又可以避免多重继承带来的种种问题。

Jetson工业级应用指南:用Orin NX 16GB打造多摄像头AI质检系统 本文详细介绍了如何利用NVIDIA Jetson Orin NX 16GB构建高效的多摄像头AI质检系统,涵盖硬件选型、软件优化及产线部署全流程。通过100 TOPS的AI算力和多路视频处理能力,Orin NX在工业4.0时代展现出卓越的实时缺陷检测性能,特别适合嵌入式AI应用场景。 阅读详情

相关推荐

3D点云目标检测Complex-YOLO(训练篇)(一)———KITTI数据集预处理与制作

KITTI dataset Download dataset KITTI 3D Object Detection Evaluation 2017 link 下载四个部分,共41.4GB 解压后为四部分内容(相机校准矩阵calib、RGB图像image_2、标签label_2、点云数据velodyne) 对应的testing和training数据。其中,training数据为7481张(图片和点云对应的场景),testing数据 7518张(无label_2数据)。 Data Preprocess

“知识最大的敌人不是无知,而是错觉” 7150

【C++】继承知识点总结

文章目录一. 继承的概念及定义1.继承的概念2. 继承的定义2.1 定义格式2.2 继承关系和访问限定符2.3 继承后基类成员访问方式的变化2.4 几点补充二. 基类和派生类对象赋值转换1. 概念2. 补充说明 一. 继承的概念及定义 比如我们要定义学生类(Student)和老师类(Teacher),都是人这两个类都包括姓名,年龄等基础的成员变量。写两个类就要重复声明两组姓名和年龄的成员变量,搞起来麻烦,能不能单独写一个Person类里面有姓名和年龄的成员变量,让学生类和老师类继承下来,就不用单独声明姓名和

m0_51064412的博客 1011

RK平台MPP编解码实战:从源码编译到性能测试全解析

本文详细解析了在RK(瑞芯微)平台上进行MPP(Media Process Platform)多媒体编解码实战的全过程。从源码获取、交叉编译环境搭建、常见编译问题排查,到测试程序的修改调试与性能测试分析,提供了从零到一的完整指南。文章通过实测数据展示了MPP硬件编解码在嵌入式设备上的高性能与低功耗优势,帮助开发者快速掌握这一关键技术,应用于智能摄像头、视频会议终端等产品开发。

weixin_28273593的博客 543

继承和组合

组合关系是一种强关联关系,被组合的类的对象的生命周期与组合类的对象的生命周期相互依赖。子类可以重写父类的方法,实现自己的行为,同时可以通过父类的引用或指针来访问子类对象,实现多态的效果。通过继承,子类可以获得父类的成员变量和成员函数,并且可以添加自己特定的成员变量和成员函数,以扩展父类的功能或实现自己的特定需求。需要注意的是,组合关系中,被组合的类的对象是作为成员变量直接存在于组合类中的,它们共享同一个命名空间,可以直接访问和使用。继承关系中,子类继承父类的属性和方法,子类可以重写父类的方法,实现多态性。

weixin_42492218的博客 1431

独立游戏开发者的新武器:实测腾讯混元3D自动绑骨,搭配Mixamo让角色动画制作效率翻倍

本文实测腾讯混元3D自动绑骨功能与Mixamo动画库的协同使用,显著提升独立游戏开发者的角色动画制作效率。通过解决卡通角色绑骨偏差、优化骨骼权重及动画状态机配置,使原本两周的流程缩短至三天,并分享Unity中的性能优化与版权合规要点。

weixin_42662605的博客 489

ubuntu:E: 无法定位软件包yum解决方法

如果出现以下问题,则需要更新yum源 yum源位于/etc/apt/sources.list yum源更新的网站有 清华大学开源镜像 中科大开源镜像 1.此处更新yum源的时候先备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.list 将更新源替换成上面符合版本系列号 我用的版本号为20.04 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释

码农研究僧的博客 1万+

继承、组合

不使用继承: 使用继承:

无问西东的博客 1351

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5864

Java基础04——类的继承、组合与聚合

1.信息的封装 封装指将对象的状态信息(属性)和行为(方法)捆绑为一个逻辑单元的机制。模块设计追求强内聚(许多功能尽量在类的内部独立完成,不让外面干预)、弱耦合(提供尽可能少的调用给外部)。Java中通过将数据封装、属性声明为私有(private)和提供一个或多个公开的(public)方法实现对该属性的操作。 2.类的继承(Inheritance) 继承就是子类继承父类的特征和行为,使得子...

discover_space 790

lammps模拟石墨烯吸附水分子(gcmc)

本文分享lammps gcmc吸附的一个案例代码,上下壁面的通道材料为石墨烯,吸附的分子为tip4p水分子。大家好,我是小马老师。

lammps_jiayou的博客 2590

第五章:转矩脉动的成因与抑制技术:从根源到解决方案

本文摘要: 转矩脉动是电机运行中的关键问题,涉及电磁、机械和控制三大因素。电磁因素包括谐波、齿槽转矩和磁饱和;机械因素涵盖动平衡和轴承缺陷;控制因素涉及测量误差和死区效应。解决方案采用多层面优化:硬件上通过斜极设计和死区补偿(提供算法代码)降低脉动70%;控制上采用扰动观测器和谐振控制器进行动态抑制;针对齿槽转矩开发离线学习+在线查表补偿方案。测试环节建立振动噪声量化评价体系,包括加速度计测量和A计权声学评估。最终形成从设计到控制的系统化抑制策略,显著提升电机静音性、平顺性和寿命。

汽车软件开发 338

类的组合和继承

一、定义 类的组合:类中数据成员是另一个类的对象,该类是一个容器类; 类的继承:一个新类从已有的类那里获得其已有特性。 二、优缺点 类的组合: 优点: 1.“黑盒”复用,被包含的其他类中的具体实现是看不到的,只提供了接口; 2.封装性比较好,因为组合的其他类只提供接口; 3.依赖性较小,容器类类中组合的其他类对象独立完成一项功能,相互之间依赖关系较少; 4.通过适当的设置指针,可

captain_wangnb的博客 496

在ParaView中编程实现涡量可视化

综上所述,本文介绍了在ParaView中使用编程方式实现涡量可视化的方法,并提供了相应的Python代码示例。通过灵活运用ParaView的编程接口,我们可以根据特定需求定制复杂的数据可视化流程,进一步深入了解和分析流体的旋转行为。ParaView是一款强大的开源数据可视化工具,它提供了丰富的功能和灵活的编程接口,使用户能够定制数据可视化流程。你可以根据需要自定义颜色映射范围和颜色,上述代码中的RGBPoints列表中包含了两个点,分别对应涡量值为0和10时的颜色。在实际使用过程中,你需要替换代码中的。

ByteProwl的博客 1434

Java类的组合与继承的关系你了解多少?

文章目录类的组合组合的意义组合的语法组合举例:线段类组合与继承的比较组合与继承的结合 类的组合 组合的意义 面向对象的程序用软件对象来模仿现实世界的对象: 现实世界中,大多数对象由更小的对象组成; 与现实世界的对象一样,软件中的对象也常常是由更小的对象组成。 Java的类中可以有其他类的对象作为成员,这便是类的组合。 组合也是一种重用机制,可以使用“有一个” 来描述这种关系。 组合的语法...

WalterBailey's Blog 434

深度学习工具包 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")

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

类得继承与组合

在一个类中,可以用类对象作为数据成员,即子对象。

u012223598的专栏 1029

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

组合与类继承

# 组合:自定义类的对象作为另外一个类的属性class Teacher: def __init__(self,name,age): self.name = name self.age= aget1=Teacher('bob',17)class Student: def __init__(self,name,age,teacher): self....

weixin_30483697的博客 141

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JavaScript 中组合继承、类与extends继承

ES6中新增了类的语法。类使用起来非常方便,但是在讲类之前,我们先来看看在类出生之前,强大的JavaScript是以什么样的方式让构造函数之间进行继承的——组合继承。 1 组合继承 ES6之前并没有给我们提供 extends 继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承。 1.1 借用构造函数继承父类型的属性 1.1.1 call() 方法 功能:调用这个函数, 并且...

weixin_41309331的博客 1189

类的继承与组合

无论是继承与组合本质上都是把子对象放在新类型中,两者都是使用构造函数的初始化列表去构造这些子对象。 组合通中是在希望新类内部具有已存在的类的功能时使用,而不是希望已存在类作为它的接口。组合通过嵌入一个对象以实现新类的功能,而新类用户看到的是新定义的接口,而不是来自老类的接口。(has-a) 如果希望新类与已存在的类有相同的接口(在这基础上可以增加自己的成员)。这时候需要用继承,也称为子类型化。

oAmamatthew的专栏 642

python中组合与继承的区别_python类与对象的组合与继承

1、把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定。简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景中。例如,水池里有一个乌龟,天上有一个鸟,地上有一个小甲鱼,这些适合使用组合。青瓜是瓜,女人是人,鲨鱼是鱼,这些就应该使用继承啦实例如下:class Turtle:def __init__(self,...

weixin_39609527的博客 490

C++拿来主义--- 类的组合与继承

类的基础概念类的继承和组合为面向对象的程序设计提供了代码复用的可能性,奉行拿来主义。类的组合较为简单,掌握了如何初始化那么应用就可以得心应手的使用了。类的继承主要是插播知识点那一块比较抽象,建议多体会,多找找资料,看看书等等,我的水平肯定和作者比不了,还有就是构造函数和虚函数,值得注意。......

露忆丶十二的博客 650

python-32-类的组合与初识继承

前言 组合:在一个类的属性中调用了另一个类,将另一个类的对象作为数据属性,称为类的组合。 继承:一种新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类,先有父类才会有子类 一、类组合 组合指的是,在一个类中调用了另一个类,将另一个类的对象作为数据属性,称为类的组合。 1、组合实例1: ①Ojb_1是装备库类,func_name是一件装备,人物装备后会增加10...

有话好好说vx:GoGsxl 202

python类与对象,类的继承,类的派生,类的组合,多态

面向对象编程 1.类与对象 在python中先有类再有对象,类和对象,你可以看成,类是把对象的相同特征和相同方法汇总再一起,再根据类来生成对象,这个对象具有类的特征与方法 1.类的命名 class 类名:#这里类名必须用驼峰体进行命名有些特殊情况除外 name = a #特征 def __init__(self): self #对于生成的对象来说是生成的对象,对于类来说是个要传的形...

Python-全栈开发教程-入门到精通 179

python 类继承和组合_python类与对象的组合与继承

1、把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定。简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景中。例如,水池里有一个乌龟,天上有一个鸟,地上有一个小甲鱼,这些适合使用组合。青瓜是瓜,女人是人,鲨鱼是鱼,这些就应该使用继承啦实例如下:class Turtle:def __init__(self,...

weixin_39670464的博客 251

类的继承、类的组合与 PHP 的 traits 特性

面向对象的优势在于类的复用,继承与多态都是对类进行复用,继承是类级别的复用,多态是方法级别的复用。提到类的继承就必须提到类的组合,继承和组合有何异同?PHP到底有没有多态?这些将在下面进行讲述。 1. 类的继承 类与类之间有一种父与子的关系,子类继承父类的属性和方法,称为继承。在继承里,子类可以拥有父类的属性(除私有属性之外),也可以拥有父类的方法(除私有方法之外),同时,子类还可以有

彳亍 3241

python 类组合_python类与对象的组合与继承

1、把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定。简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景中。例如,水池里有一个乌龟,天上有一个鸟,地上有一个小甲鱼,这些适合使用组合。青瓜是瓜,女人是人,鲨鱼是鱼,这些就应该使用继承啦实例如下:class Turtle:def __init__(self,...

weixin_39561577的博客 233

类与对象,类的继承,类的派生,类的组合,多态

6.18-6.19自我总结 面向对象编程 1.类与对象 在python中先有类再有对象,类和对象,你可以看成,类是把对象的相同特征和相同方法汇总再一起,再根据类来生成对象,这个对象具有类的特征与方法 1.类的命名 class 类名:#这里类名必须用驼峰体进行命名有些特殊情况除外 name = a #特征 def __init__(self): self #对于生成的对象来...

aiyulove201314的博客 361
上一篇: windows下面的Docker安装详细
下一篇: 各种语言中的多态
键盘钢琴师
博客等级 码龄11年 21粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值