2017-11-27 27 views
-1

私はこの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で合法ではないのですか?

+0

正確なエラー、トレースバック、およびすべてを送信してください。 – chepner

+0

エラーについては分かりませんが、Pythonの 'setSize'メソッドは何もしません。おそらく、あなたは 'cls.size = s'を望んでいるでしょう。 –

+1

待ってください、あなたはPython 2ですか?そうであれば、 'classmethod'を使うために' object'から明示的に継承する必要があります。そうでなければ古いスタイルのクラスであり、デコレータは正しく動作しません。 –

答えて

1

Pythonには、Javaの静的変数と完全に同等のものはありません。しかし、クラス本体内では宣言されているが、メンバ関数の外に宣言されているクラス変数はありません。これらの変数にアクセスするには、 "。"の前のクラス名を使用します。インスタンスの代わりに。あなたが望むものは次のようなものです:

class Page: 
    size = 0 # Moved out of __init__ 
    def __init__(self, frame): 
     self.frameId = frame 
     self.pageId = -1 
     self.timeEvicted = 0 
     self.timeLoaded = 0 
     self.ifLoaded = False 
     self.ownerProcess = 0 
     self.referencedWords = [] 

    def initalize(owner, pgId, refdWord, ifLoad): 
     self.ownerProcess = owner 
     self.pageId = pgId 
     addRefdWord(refdWord) 
     self.ifLoaded = ifLoad 

    @staticmethod # Changed from classmethod 
    def setSize(s): 
     Page.size = s # Syntax changed 

    def setPageId(self,p): 
     self.pageId = p 

セッターでは、必ずしもセッター機能を提供するのに良いスタイルではありません。 setSize関数を完全に削除した場合、クライアントコードは単に関数呼び出しではなくPage.size = sを使用してサイズを設定できます。多くのセッター関数を書くことで得られるべきことはほとんどありません。

+0

ありがとう!ゲッター関数を変更できるのと同じ方法がありますか? – MarkJ

+0

クラスメソッドから変更する必要はありません。新しいスタイルのクラスであれば、単に 'cls.size = s'が必要です。 – jonrsharpe

+0

@jonrsharpeこの場合は真ですが、クラスが 'Page'から派生したときに違いがあります。 –

関連する問題