сумма () и нецелые значения Python

Вот решение ( java + windows ), чтобы определить, является ли основной компьютер физическим или виртуальным.

Примеры виртуальных машин:

Производитель

g13]
  • Xen
  • Корпорация Microsoft
  • innotek GmbH
  • Red Hat
  • VMware, Inc.
  • ]

Модель

  • HVM domU
  • Виртуальная машина
  • VirtualBox
  • KVM
  • Виртуальная платформа VMware
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class OSUtil {
    
    public static final List<String> readCmdOutput(String command) {
        List<String> result = new ArrayList<>();
    
        try {
            Process p=Runtime.getRuntime().exec("cmd /c " + command);
            p.waitFor();
            BufferedReader reader=new BufferedReader(
                    new InputStreamReader(p.getInputStream())
                    );
            String line;
            while((line = reader.readLine()) != null) {
                if(line != null && !line.trim().isEmpty()) {
                    result.add(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return result;
    }
    
    public static final String readCmdOutput(String command, int lineNumber) {
        List<String> result = readCmdOutput(command);
        if(result.size() < lineNumber) {
            return null;
        }
    
        return result.get(lineNumber - 1);
    }
    
    public static final String getBiosSerial() {
        return readCmdOutput("WMIC BIOS GET SERIALNUMBER", 2);
    }
    
    public static final String getHardwareModel() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MODEL", 2);
    }
    
    public static final String getHardwareManufacturer() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MANUFACTURER", 2);
    }
    
    public static void main(String[] args) {
        System.out.println("BIOS Serial: " + getBiosSerial());
        System.out.println("Hardware Model: " + getHardwareModel());
        System.out.println("Hardware Manufacturer: " + getHardwareManufacturer());
    }
    }
    

Вы можете использовать выход для определения, является ли это виртуальной машиной или физической машиной:

Выход физической машины:

BIOS Последовательный: 2HC3J12 Аппаратная модель: Inspiron 7570 Производитель оборудования: Dell Inc.

Выход виртуальной машины:

BIOS Последовательный: 0 Аппаратная модель: Innotec GmBH Hardware Производитель: Виртуальная коробка

24
задан sloth 2 August 2009 в 11:57
поделиться

5 ответов

Это немного сложно - функция sum () берет начало и добавляет его к следующему и т.д.

Вам необходимо реализовать метод __ radd __ :

class T:
    def __init__(self,x):
        self.x = x
    def __radd__(self, other):
        return other + self.x

test = (T(1),T(2),T(3),200)
print sum(test)
28
ответ дан 28 November 2019 в 18:25
поделиться

Попробуйте:

import operator
result=reduce(operator.add, mylist)

sum () работает, вероятно, быстрее, но он специализируется только на встроенных числах. Конечно, вам все равно нужно предоставить метод для добавления ваших объектов Foo (). Полный пример:

class Foo(object):
    def __init__(self, i): self.i = i
    def __add__(self, other):
        if isinstance(other, int):
            return Foo(self.i + other)
        return Foo(self.i + other.i)
    def __radd__(self, other):
        return self.__add__(other)

import operator
mylist = [Foo(42), Foo(36), Foo(12), 177, Foo(11)]
print reduce(operator.add, mylist).i
6
ответ дан 28 November 2019 в 18:25
поделиться

Попробуйте использовать метод __ int __ , а затем сопоставьте каждый элемент в вашем списке с функцией int , чтобы получить значения:

class Foo(object):
    def __init__(self,bar):
        self.bar = bar
    def __int__(self):
        return self.bar

mylist = [Foo(3),Foo(34),Foo(63),200]
result = sum(map(int,mylist))
print(result)
3
ответ дан 28 November 2019 в 18:25
поделиться

Или, если вы не хотите ничего импортировать,

result = reduce((lambda x,y:x+y), mylist)

Еще одно небольшое преимущество заключается в том, что вам необязательно объявлять метод __ add __ как часть ваших объектов Foo , если это единственное обстоятельство, в котором вы хотите выполнить сложение. (Но, вероятно, не помешало бы определить __ add __ для будущей гибкости.)

5
ответ дан 28 November 2019 в 18:25
поделиться

Вам также может потребоваться реализовать функцию __ radd __ , которая представляет «обратное сложение» и вызывается, когда аргументы не могут быть разрешены в «прямом» направлении. Например, x + y оценивается как x .__ add __ (y) , если возможно, но если это не существует, Python пытается y .__ radd __ (x) .

Поскольку функция sum () начинается с целого числа 0 , первое, что она делает, это пытается вычислить:

0 + Foo(3)

, что потребует от вас реализации Foo .__ radd __ .

19
ответ дан 28 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: