私はこのJavaコードをPythonに書き直そうとしています。これは、(完璧に動作します)Javaコードです:Pythonでクラスを初期化せずにクラスメソッドを呼び出す
public class Main {
private static Pager demandPager;
private static ArrayList<Process> runningProcesses = new ArrayList<Process>();
private static ArrayList<Process> finishedProcesses = new ArrayList<Process>();
private static int numProcesses;
private static int numRefPerProcess;
private static int clock;
private final static int QUANTUM = 3;
private static File randNum;
private static Scanner randReader;
public static void main(String[] args) {
readInput(args);
initializeRandNums();
int prIdx = 0;
while(runningProcesses.size() > 0) {
Process p = runningProcesses.get(prIdx);
for (int ref = 0; ref < QUANTUM; ref++) {
demandPager.processRef(p, clock, randReader);
p.setCurrentReference(p.c
alcNextReference(randReader));
p.incrRefsMade();
clock++;
if (p.getRefsMade() == numRefPerProcess) {
finishedProcesses.add(p);
runningProcesses.remove(p);
prIdx--;
break;
}
}
if (prIdx == numProcesses-1) {
prIdx = 0;
}
else {
prIdx++;
}
}
printOutput(args);
}
public static void readInput(String[] args) {
if (args.length != 6) {
System.out.println("Please input the machine size, page size, process size, job mix, number of references per process, and the replacement algorithm.");
System.exit(0);
}
demandPager = new Pager(Integer.parseInt(args[0]), Integer.parseInt(args[1]));
Page.setSize(Integer.parseInt(args[1]));
Process.setSize(Integer.parseInt(args[2]));
initializeProcesses(args[3]);
numRefPerProcess = Integer.parseInt(args[4]);
demandPager.setReplacementAlgo(args[5]);
}
は
This is the Page Class
import java.util.ArrayList;
public class Page {
private static int size;
private int timeEvicted;
private int timeLoaded;
private int timeLastUsed;
private ArrayList<Integer> referencedWords;
private int frameId;
private int pageId;
private Process ownerProcess;
private boolean ifLoaded;
public Page(int frame) {
frameId = frame;
pageId = -1;
timeEvicted = 0;
timeLoaded = 0;
ifLoaded = false;
ownerProcess = null;
referencedWords = new ArrayList<Integer>();
}
public void initalize(Process owner, int pgId, int refdWord, boolean ifLoad) {
ownerProcess = owner;
pageId = pgId;
addRefdWord(refdWord);
ifLoaded = ifLoad;
}
public static void setSize(int s) {
size = s;
}
public void setPageId(int p) {
pageId = p;
}
のPythonに変換することでの私の試みは次のとおりです。
from Process import Process
from Page import Page as Page
from Pager import Pager
from FrameTable import FrameTable
import sys
#store random numbers in a list
r = open('random.txt')
l = []
for c in r:
l.append(int(c))
runningProcesses = []
finishedProcesses = []
def main():
#read input
machineSize = int(sys.argv[1])
pageSize = int(sys.argv[2])
processSize = int(sys.argv[3])
jobMix = int(sys.argv[4])
numOfRefPerProcess = int(sys.argv[5])
replacementAlgo = (sys.argv[6])
demandPager = Pager(machineSize, pageSize)
Page.setSize(pageSize)
Process.setSize(processSize)
setProc(jobMix)
demandPager.setAlg(replacementAlgo)
index = 0
while(runningProcesses.size() > 0):
p = runningProcesses.get(index)
for i in range(3):
demandPager.processRef(p, clock, randReader)
p.setCurrentReference(p.calcNextReference(randReader))
p.incrRefsMade()
clock+=1
if (p.getRefsMade() == numRefPerProcess):
finishedProcesses.add(p)
runningProcesses.remove(p)
index-=1
break
if (index == numProcesses-1):
index = 0
else:
index+=1
print "print ng....."
printOutput(args)
The Class Page:
class Page:
def __init__(self, frame):
self.frameId = frame
self.pageId = -1
self.timeEvicted = 0
self.timeLoaded = 0
self.ifLoaded = False
self.ownerProcess = 0
self.referencedWords = []
self.size = 0
def initalize(owner, pgId, refdWord, ifLoad):
self.ownerProcess = owner
self.pageId = pgId
addRefdWord(refdWord)
self.ifLoaded = ifLoad
@classmethod
def setSize(cls, s):
size = s
def setPageId(self,p):
self.pageId = p
私の問題はありますこのコードを実行しようとするたびに、私はこのエラーを受け取ります: TypeError:バインドされていないメソッドsetSize()は、最初の引数としてProcessインスタンスで呼び出される必要があります(代わりにintインスタンスが取得されます)。
これはなぜわかりません。これはPythonで合法ではないのですか?
正確なエラー、トレースバック、およびすべてを送信してください。 – chepner
エラーについては分かりませんが、Pythonの 'setSize'メソッドは何もしません。おそらく、あなたは 'cls.size = s'を望んでいるでしょう。 –
待ってください、あなたはPython 2ですか?そうであれば、 'classmethod'を使うために' object'から明示的に継承する必要があります。そうでなければ古いスタイルのクラスであり、デコレータは正しく動作しません。 –