我正在从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中的重载解决方案相比,它看起来很混乱.
我想在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个可见按钮(另一个可能隐藏在这个按钮后面),它位于屏幕的左上角.应该有两个按钮,在屏幕的底部,相互链接.
我在这做错了什么?
期望的结果:
我正在编写一个基本的文本编辑器,我想编辑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) 精简版:
如何在 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,对于那些感兴趣的人)。
通常我们声明抽象类的子类是具体的,并将抽象方法覆盖为具体的.是否存在相反的用途?
我最近在设置一个包含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
我最近遇到了这个令人沮丧的问题,扫描程序完全忽略了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) 我正在尝试编辑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) 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 ×6
android ×2
python ×2
c++ ×1
equals ×1
file ×1
function ×1
html ×1
inheritance ×1
input ×1
methods ×1
printwriter ×1
pyinstaller ×1
python-3.x ×1
qt ×1
replaceall ×1
return ×1
stream ×1
text ×1