小编Ein*_*nar的帖子

如何在python中使用不同的参数编写同名方法

我正在从Java背景学习Python(3.x).

我有一个python程序,我在其中创建一个personObject并将其添加到列表中.

p = Person("John")
list.addPerson(p)
Run Code Online (Sandbox Code Playgroud)

但是为了灵活性,我还希望能够直接在addPerson方法中声明它,如下所示:

list.addPerson("John")
Run Code Online (Sandbox Code Playgroud)

addPerson方法将能够区分我是否发送Person-object或String.

在Java中,我将创建两个单独的方法,如下所示:

void addPerson(Person p) {
    //Add person to list
}

void addPerson(String personName) {
    //Create Person object
    //Add person to list
}
Run Code Online (Sandbox Code Playgroud)

我无法在Python中找到如何做到这一点.我知道一个type()函数,我可以用它来检查参数是String还是Object.然而,这对我来说似乎很混乱.还有另一种方法吗?

编辑:

我想替代解决方法将是这样的(python):

def addPerson(self, person):
    //check if person is string
        //Create person object

    //Check that person is a Person instance
        //Do nothing

    //Add person to list
Run Code Online (Sandbox Code Playgroud)

但与Java中的重载解决方案相比,它看起来很混乱.

python methods function parameter-passing python-3.x

8
推荐指数
2
解决办法
9891
查看次数

ConstraintLayout:如何以编程方式添加多个视图?

我想在ConstraintLayout中添加2个按钮.我目前的代码如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.activity_main);
    ConstraintSet set = new ConstraintSet();
    set.clone(layout);

    //Button 1: 
    Button button = new Button(this);
    button.setText("Hello");
    layout.addView(button);

    set.connect(button.getId(), ConstraintSet.LEFT, layout.getId(), ConstraintSet.LEFT, 0);
    set.connect(button.getId(), ConstraintSet.RIGHT, layout.getId(), ConstraintSet.RIGHT, 0);
    set.connect(button.getId(), ConstraintSet.BOTTOM, layout.getId(), ConstraintSet.BOTTOM, 0);
    set.constrainWidth(button.getId(), ConstraintSet.MATCH_CONSTRAINT);
    set.constrainHeight(button.getId(), 200);
    set.applyTo(layout);


    //Button 2:     
    Button newButton = new Button(this);
    newButton.setText("Yeeey");
    layout.addView(newButton);

    set.connect(newButton.getId(), ConstraintSet.BOTTOM, button.getId(), ConstraintSet.TOP, 0);
    set.connect(newButton.getId(), ConstraintSet.LEFT, button.getId(), ConstraintSet.LEFT, 0);
    set.connect(newButton.getId(), ConstraintSet.RIGHT, button.getId(), ConstraintSet.RIGHT, 0);
    set.constrainHeight(newButton.getId(), 200);
    set.applyTo(layout);

}
Run Code Online (Sandbox Code Playgroud)

但我只得到1个可见按钮(另一个可能隐藏在这个按钮后面),它位于屏幕的左上角.应该有两个按钮,在屏幕的底部,相互链接.

我在这做错了什么?

在此输入图像描述

期望的结果:

在此输入图像描述

java android android-layout android-constraintlayout

7
推荐指数
1
解决办法
5455
查看次数

问:如何以纯文本格式打开Html文件?

我正在编写一个基本的文本编辑器,我想编辑HTML文件.目前我有一个QTextEdit,我可以在其中写入文本,然后保存到文件/从文件打开.

问题是当我打开HTML文件时,它不会以纯文本形式打开.相反,它将作为已处理的HTML打开.即使我保存为.txt,也会发生这种情况.所以我可以写

<html>
    <h1>Test</h1>
</html>
Run Code Online (Sandbox Code Playgroud)

在textEdit中,将其另存为文本文件.但是,如果我打开它,突然它处理HTML.当我打开从Notepad ++保存的Html文件时,会发生同样的事情.

如何以纯文本形式打开文件,就像记事本一样?

继承了我现在的代码:

void Notepad::on_actionOpen_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), QString(),
                                                    tr("Text Files (*.txt);;C++ Files (*.cpp *h);;All types (*.*)"));
    if (!fileName.isEmpty()) {
        QFile file(fileName);

        if (!file.open(QIODevice::ReadOnly)) {
            QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
            return;
        }

        QTextStream in(&file);
        ui->textEdit->setText(in.readAll());
        file.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

html c++ qt text file

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

如何从脚本而不是终端使用 PyInstaller?

精简版:

如何在 Python 脚本中而不是在终端中使用 PyInstaller?

我需要在 Python 脚本中编写什么才能获得相当于在终端中编写的内容:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
Run Code Online (Sandbox Code Playgroud)

长版:

我正在使用一个需要使用 PyInstaller 来分发可执行文件的库。但是我必须运行一次 PyInstaller,然后更改规范文件,然后通过 PyInstaller 运行规范文件。

所以在终端我会这样做:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
Run Code Online (Sandbox Code Playgroud)

运行完成后,我手动更改规范文件。然后我运行:

>python -m PyInstaller WorkLogger.spec
Run Code Online (Sandbox Code Playgroud)

我编写了一个脚本,通过运行为我完成体力劳动

>change_spec.py
Run Code Online (Sandbox Code Playgroud)

但我最终想在一个 Python 脚本中完成所有这些。我希望能够输入这样的东西:

>distribute_python_project.py ./Worklogger
Run Code Online (Sandbox Code Playgroud)

这意味着我的 Python 脚本需要看起来像这样:

#Psuedocode:
#python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
#Code from change_spec.py
#python -m PyInstaller WorkLogger.spec
Run Code Online (Sandbox Code Playgroud)

但是我无法弄清楚如何从 python 脚本而不是从终端使用 PyInstaller。这可能吗?(我使用的图书馆是 Kivy,对于那些感兴趣的人)。

python pyinstaller

5
推荐指数
3
解决办法
4255
查看次数

为什么可以将具体类的子类声明为abstract,并且可以重写某些父类方法并将其声明为abstract?

通常我们声明抽象类的子类是具体的,并将抽象方法覆盖为具体的.是否存在相反的用途?

java inheritance

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

我是如何阻止使用LayoutInflater()抛出IllegalStateExceptions的?inflate(int resource,ViewGroup root,boolean attachToRoot)?

我最近在设置一个包含3个片段的viewpager时遇到了一个问题.当应用程序运行时,它崩溃了

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first
Run Code Online (Sandbox Code Playgroud)

以下是用于创建要传递给pageAdapter的片段列表列表的代码.

private Vector<Fragment> getFragments() {
    Vector<Fragment> list = new Vector<Fragment>();

    list.add(new Fragment1());
    list.add(new Fragment2());
    list.add(new Fragment3());

    return list;
Run Code Online (Sandbox Code Playgroud)

除了使用不同布局创建的片段之外,每个片段基本相同.这是我对其中一个片段的原始代码.公共类Fragment1扩展Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    View v = getActivity().getLayoutInflater().inflate(R.layout.fragment1, container);
    return v;
}
} 
Run Code Online (Sandbox Code Playgroud)

但是当我像这样运行它时,它一直与IllegalStateException崩溃.我发现问题来自于正在创建的片段.经过一些谷歌搜索后,我尝试将片段的代码更改为此.

公共类Fragment1扩展Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = getActivity().getLayoutInflater().inflate(R.layout.fragment1, container, false);

    return v;
}
} …
Run Code Online (Sandbox Code Playgroud)

java android illegalstateexception android-fragments layout-inflater

0
推荐指数
1
解决办法
96
查看次数

扫描仪忽略某些输入(System.in)

我最近遇到了这个令人沮丧的问题,扫描程序完全忽略了System.in输入流中的一些输入.这是一个例子:

Do you want a cookie? Yes or no.
Run Code Online (Sandbox Code Playgroud)

现在,我输入是:

yes
Run Code Online (Sandbox Code Playgroud)

结果:

Cookie for you!
Run Code Online (Sandbox Code Playgroud)

现在,如果我说不:

no
no
Run Code Online (Sandbox Code Playgroud)

结果:

No Cookie for you.
Run Code Online (Sandbox Code Playgroud)

得到它?如果我说是,那就接受它.如果我说不,我必须输入2次.

如果你真的需要一些代码.这里有一些:)

public static void main(String[] paramArgs){
    MainEW sMain = new MainEW();
    Scanner s = sMain.scanner;

    System.out.println("Enter a file path.");
    System.out.println("Example: /Users/Some_User/Desktop/Some_Folder");
    String defPath = s.next();

    System.out.println("Enter a name for the file.");
    String defName = s.next() + ".txt";

    System.out.println("Now, enter what you want to write to the file.");
    s.nextLine();
    String defText = s.nextLine();

    System.out.println("Do you want to …
Run Code Online (Sandbox Code Playgroud)

java input stream

0
推荐指数
1
解决办法
49
查看次数

在新文本文件中打印替换行

我正在尝试编辑matlab文件并在某些特定行中替换一些编码部分init.但是,使用下面的格式进行更改它根本不会更改行上下文.(它将打印相同的旧行).知道我做错了什么吗?'replaceAll'不适合用行中的其他单词替换某些单词?

提前致谢.

try {
    PrintWriter out = new PrintWriter(new FileWriter(filenew, true));
    Scanner scanner = new Scanner(file);

    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();

        if (line.contains("stream.Values(strmatch('Test',stream.Components,'exact'))") {  
            String newline = line.replaceAll("stream.Values(strmatch('Test',stream.Components,'exact'))", "New Data");

            out.println(newline);
            System.out.println(newline);
        } else {
            out.write(line);
            out.write("\n");
        }
    }     // while loop

    out.flush();
    out.close();
    scanner.close();



} catch (IOException e)  {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

java printwriter replaceall java.util.scanner

0
推荐指数
1
解决办法
60
查看次数

为什么在equals方法中必须使用2个return语句

public class MyStuff {
    String name;

    MyStuff(String n) {
        name = n;
    } 

    public static void main(String[] args) {
        MyStuff m1 = new MyStuff("guitar");
        MyStuff m2 = new MyStuff("tv"); 

        System.out.println(m2.equals(m1));
    }

    public boolean equals(Object o) {
        MyStuff m = (MyStuff) o;

        if (m.name != null)
            return true;

        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我删除其中一个return语句时,编译器会给出一个错误:此方法必须返回boolean类型的结果

java return equals

-9
推荐指数
1
解决办法
125
查看次数