小编Eri*_*mus的帖子

自动调用超类方法

考虑以下课程

class A{
    public void init(){
        //do this first;
    }
    public void atEnd(){
        //do this after init of base class ends
    }
}

class B1 extends A{

    @Override
    public void init()
    {
        super.init();
        //do new stuff.
        //I do not want to call atEnd() method here...
    }
}
Run Code Online (Sandbox Code Playgroud)

我有几个已经开发的B1,B2,... Bn子类.所有这些都扩展了A类.如果我想在所有这些中添加一个新功能,最好的方法是在A类的方法中定义它.但条件是该方法应始终在之前自动调用子类的init()方法结束.一种基本的方法是在子类的init()方法结束时再次添加atEnd()方法调用.但有没有其他方法可以做到这一点?

java inheritance

10
推荐指数
1
解决办法
3506
查看次数

如何在python中验证签名文件

背景

我已经使用openssl SHA256和私钥对文件进行了签名,如下所示:

with subprocess.Popen(
        # Pipe the signature to openssl to convert it from raw binary encoding to base64 encoding.
        # This will prevent any potential corruption due to line ending conversions, and also allows 
        # a human to read and copy the signature (e.g. for manual verification).
        'openssl dgst -sha256 -sign private.key sign_me.zip | openssl base64 > signature.sha256',
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        shell=True,
) as proc:
    out, _ = proc.communicate()
Run Code Online (Sandbox Code Playgroud)

要求

  1. 我需要使用signature.sha256public_key.crt确认sign_me.zip尚未修改。
  2. 兼容Python 3.2-3.4 …

ssl openssl cryptography sha256 python-3.x

6
推荐指数
1
解决办法
3476
查看次数

检测python程序是否通过Windows GUI(双击)vs命令提示符执行

背景
我有一个 Python 3.5 控制台程序通过 pyinstaller 编译成 Windows 可执行文件。

  • 当通过命令提示符执行时,我希望我的程序使用提供的任何参数(可能没有)运行。
  • 当通过操作系统的 GUI 执行时(即通过在 Windows 上的 Windows 资源管理器中双击 .exe 等),我希望我的程序提示用户输入。我还需要我的程序在退出前暂停,以便用户可以读取输出。

我如何检测这些不同的场景?

约束

  1. 可执行文件必须能够在准系统(即全新安装)Windows/RedHat 机器上运行。
  2. 编译可执行文件必须是单个文件,可以不依赖于编译的可执行文件中没有打包的其他文件(pyinstaller允许文件内编译的可执行文件打包)。
  3. 该程序可能依赖于 3rd 方 python 包。

我尝试过的事情

python windows pyinstaller python-3.x

5
推荐指数
1
解决办法
980
查看次数

模块引用在调用模块方法中传递

我有一个调用的perl脚本fetch.pl和一个名为的模块My_Util.pm.

My_Util.pm

package My_Util;

sub get_header
{
    my $msg = shift;
    return " ===== $msg ===== ";
}

1; # Perl modules must return a true value when loaded.
Run Code Online (Sandbox Code Playgroud)

fetch.pl

use My_Util;

print_and_log(My_Util->get_header("foo"));
print_and_log("blah");

sub print_and_log
{
    my $message = shift;
    print("$message\n");
}
Run Code Online (Sandbox Code Playgroud)

预期产出:

===== foo =====
blah
Run Code Online (Sandbox Code Playgroud)

实际产量:

===== My_Util =====
blah
Run Code Online (Sandbox Code Playgroud)

编辑:修复了语法错误

perl

3
推荐指数
1
解决办法
76
查看次数

Control.AddRange(...)很慢

项目: 我有一个父面板,其中包含一个ComboBox和FlowLayoutPanel。FlowLayoutPanel拥有可变数量的子面板(从UserControl继承的自定义控件)。每个子面板包含一些标签,两个ComboBox,一个按钮以及一个带有3个ComboBox列和一个按钮列的DataGridView。DataGridView可能有1-6行。从父面板的ComboBox中选择一个项目时,FlowLayoutPanel会填充子面板。

在此处输入图片说明

问题: 用大约50个子面板填充FlowLayoutPanel大约需要2.5秒。具体来说,我确定对FlowLayoutPanel.Controls.AddRange()的调用是罪魁祸首。

相关代码:我无法在此处发布所有代码(太多代码及其部分内容是机密的),但我会尽力解释正在发生的事情。

父面板:

private void displayInformation(Suite suite)
{
    this.SuspendLayout();

    // Get dependencies.
    List<SuiteRange> dependents = new List<SuiteRange>(suite.dependencies.Keys);
    dependents.Sort(SuiteRange.Compare);

    // Create a ChildPanel for each dependent.
    List<ChildPanel> rangePanels = new List<ChildPanel>();
    foreach (SuiteRange dependent in dependents)
    {
        ChildPanel sdp = new ChildPanel();
        sdp.initialize(initialSuite.name, dataAccess);
        sdp.displayInformation(dependent, suite.dependencies[dependent]);
        rangePanels.Add(sdp);
    }

    // Put the child panels in the FlowLayoutPanel.
    flpDependencyGroups.SuspendLayout();
    // Takes ~2.5 seconds
    flpDependencyGroups.Controls.AddRange(rangePanels.ToArray());
    flpDependencyGroups.ResumeLayout();

    // Takes ~0.5 seconds
    updateChildPanelSizes();

    this.ResumeLayout();
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情:

  • 在父面板和/或FlowLayoutPanel上调用SuspendLayout()/ ResumeLayout()。性能提升最小(〜0.2秒)。
  • 在ComboBoxes,Button和DataGridView列上使用Control.FlatStyle.Flat。性能提升最小(〜0.1秒)。
  • 验证我的控件均未使用透明背景色。
  • 将ChildPanel.DoubleBuffered和ParentPanel.DoubleBuffered设置为true。
  • 在调用AddRange()之前从其父级中移除FlowLayoutPanel,然后再重新添加它。 …

.net c# flowlayoutpanel .net-2.0 winforms

2
推荐指数
1
解决办法
3412
查看次数