Вот решение ( java + windows ), чтобы определить, является ли основной компьютер физическим или виртуальным.
Примеры виртуальных машин:
Производитель
g13]Модель
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 Производитель: Виртуальная коробка
Это немного сложно - функция 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)
Попробуйте:
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
Попробуйте использовать метод __ 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)
Или, если вы не хотите ничего импортировать,
result = reduce((lambda x,y:x+y), mylist)
Еще одно небольшое преимущество заключается в том, что вам необязательно объявлять метод __ add __
как часть ваших объектов Foo , если это единственное обстоятельство, в котором вы хотите выполнить сложение. (Но, вероятно, не помешало бы определить __ add __
для будущей гибкости.)
Вам также может потребоваться реализовать функцию __ radd __
, которая представляет «обратное сложение» и вызывается, когда аргументы не могут быть разрешены в «прямом» направлении. Например, x + y
оценивается как x .__ add __ (y)
, если возможно, но если это не существует, Python пытается y .__ radd __ (x)
.
Поскольку функция sum ()
начинается с целого числа 0
, первое, что она делает, это пытается вычислить:
0 + Foo(3)
, что потребует от вас реализации Foo .__ radd __
.