如何在Python中的__init __()部分中定义子进程?

时间:2015-06-14 13:32:37

标签: python coding-style

考虑以下课程:

import subprocess

class Fruits():
    def __init__(self):
        self.TERMINAL_WIDTH = 80

    def start(self):
        p = subprocess.Popen(["mplayer", "other", "args"])
        print "Subprocess started..."

此代码有效。

为了更好地了解最佳编码实践,我使用PEP 8 linter for Python。 linter抱怨线

p = subprocess.Popen(["mplayer", "other", "args"])

:linter说因为我们正在定义一个变量(p),所以它应该转而使用__init__()方法。

我想知道如何做到这一点。如果我以当前形式将该行传输到__init__(),则在实例化Fruits()时子进程将开始运行,这不是我想要的。你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

首先,您要创建一个局部变量。没问题,但是当方法的执行完成时它就会丢失。

您很可能希望拥有一个实例变量。然后该行必须如下所示:

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class board {
    public static void addComponentsToPane(Container pane) {
        pane.setLayout(new GridLayout(1, 0));

        JPanel left = new JPanel();
        pane.add(left);
        left.setLayout(new BoxLayout(left, BoxLayout.Y_AXIS));

        JPanel leftTop = new JPanel();
        leftTop.setPreferredSize(new Dimension(125, 150));
        leftTop.setBackground(Color.black);
        left.add(leftTop);

        JPanel leftBottom = new JPanel();
        leftBottom.setPreferredSize(new Dimension(125, 150));
        leftBottom.setBackground(Color.red);
        left.add(leftBottom);

        JPanel middle = new JPanel();
        pane.add(middle);
        middle.setLayout(new BoxLayout(middle, BoxLayout.Y_AXIS));

        JPanel middleTop = new JPanel();
        middleTop.setPreferredSize(new Dimension(125, 100));
        middleTop.setBackground(Color.green);
        middle.add(middleTop);

        JPanel middleBottom = new JPanel();
        middleBottom.setPreferredSize(new Dimension(125, 200));
        middleBottom.setBackground(Color.yellow);
        middle.add(middleBottom);

        JPanel right = new JPanel();
        right.setPreferredSize(new Dimension(125, 300));
        right.setBackground(Color.blue);

        pane.add(right);
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("GridBagLayoutDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        addComponentsToPane(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

self.p = subprocess.Popen(["mplayer", "other", "args"]) 也是一个糟糕的名称选择,你应该使用更长的东西,例如p

然后有一个约定来初始化mplayer_proc中的所有实例变量,它不是必需的,但在使用IDE时非常有用。你不需要给它一个最终价值。如果初始化时没有任何内容存储,只需将其设置为__init__

None