2017-04-18 15 views
1

私は現時点で継承と多型について学習しており、このコードはこれらの概念をテストすることになっています。サブクラスオブジェクトをインスタンス化しようとすると、initコンストラクタはメソッドを認識しません。ここにコードがあります。__init__メソッドの例外 - NameError:name 'setShiftNum'が定義されていません

class Employee: 

    # constructor 
    def __init__(self, name, empnum): 
     self.__empName = name 
     self.__empNum = empnum 
     #setName(name) 
     #setNumber(empnum) 

    # setters 
    def setName(self, name): 
     self.__empName = name 

    def setNumber(self, number): 
     if len(str(number)) == 5: 
      self.__empNum = number 
     else: 
      print('Too many or too little numbers entered. Please try again') 
      setNumber() 

    # getters 
    def getName(self): 
     return self.__empName 

    def getNumber(self): 
     return self.__empNum 


class ProductionWorker(Employee): 

    # Overwritten constructor 
    def __init__(self, name, empnum, shiftnum, rate): 
     self.setShiftNum(shiftnum) 
     self.setPayRate(rate) 
     # Calls Superclass Method 
     Employee.__innit__(self, name, empnum) 

    # Setters 
    def setShiftNum(self, num): 
     if num == 1 | 2: 
      self.__shiftNum = num 
     else: 
      print('Shift number needs to be a 1 or 2. Please try again') 
      setShiftNum(self, num) 

    def setPayRate(self, rate): 
     self.__payRate = '$' + str(format(rate, ',.2f')) 

    # Getters 
    def getShiftNum(self): 
     return self.__shiftNum 

    def getPayRate(self): 
     return self.__payRate 

def main(): 
    gruntling = Employee('Farlo', 53400) 
    print('Your grunts name is' + gruntling.getName()) 
    print('this program does things. We swears.') 

    grunty = ProductionWorker('Farlo', 45300, 2, 4.25) 
    print('Lil grunty\'s name is ' + grunty.getName()) 

main() 

私が手にエラーがある:

Traceback (most recent call last): 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 69, in <module> 
    main() 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 66, in main 
    grunty = ProductionWorker('Farlo', 45300, 2, 4.25) 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 38, in __init__ 
    self.setShiftNum(shiftnum) 
    File "C:/Users/sessh/Dropbox/Spring >2016/Python/Assignments/S13/company_employee.py", line 49, in setShiftNum 
    setShiftNum(self, num) 
NameError: name 'setShiftNum' is not defined 

私は周りの閲覧と私は見つけることができる最も近い例は、私が見つけることができる最高の修正はしたこと Calling a class function inside of __init__

ました自己をinit内の関数に追加しますが、あまりにも多くの数議論それは私が言う狂気です!

ありがとうございます。

EDIT。さて、私はいくつかのコメントを読んで、私に問題を与えている機能の論理を変えました。また、コンパイラがエラーを起こしていないためにエラーが完全に発生していることに気づいていませんでした。それは興味深い知識のビットです。

# Overwritten constructor 
def __init__(self, name, empnum, shiftnum, rate): 
    #self.__shiftNum = shiftnum 
    self.__payRate = rate 
    self.setShiftNum(shiftnum) 
    # Calls Superclass Method 
    Employee.__init__(self, name, empnum) 

# Setters 
def setShiftNum(self, num): 
    shiftnum = num 
    if shiftnum == 1 or shiftnum == 2: 
     self.__shiftNum = shiftnum 
    else: 
     while True: 
      shiftnum = input('Shift Number MUST BE a 1 or a 2. Enter it now: ') 
      if shiftnum == 1 or shiftnum == 2: 
       self.__shiftNum = numshiftnum 
       break 
      else: 
       continue 

これまでに再帰関数で見たように、無限ループが好きです。だから私は別のものを作りました、何の意図もなしに私はあなたに保証します。このコードは1または2が渡された場合に実際に動作しますが、そうでない場合は、パッシブな攻撃的なプログラムの終わりのないサイクルに閉じ込められて、1と2の入力に従順を要求します

この時点では私は状況の論理に固執しているので、私は解決策に近いと思う。私は論理がかなり貧弱だと感じています。アルゴリズムの複雑さですが、現時点では動作したいだけです。

+0

'self.setShiftNum(num)'を試してください。 –

+0

また、無限の再帰があることに注意してください。再帰的な設定は設計が貧弱です。その代わりに、例外がスローされるか、そうでなければ不正なパラメータが示されます。呼び出し側はエラーを処理します。 –

+0

ここにいくつかのアイデアがあります。 http://stackoverflow.com/a/23294659/2823755 – wwii

答えて

0
def setShiftNum(self, num): 
    if num == 1 or num == 2: 
     self.__shiftNum = num 
    else: 
     print('Shift number needs to be a 1 or 2. Please try again') 
     self.setShiftNum(num) 

を満たすsetShiftNum(self,3)に変換されます。
再帰ブロックをself.setShiftNum(num = 1)のようなものに置き換えるか、ロジックを変更することを避けてください。

+0

ロジックが変更されました。キャッチをありがとう。 – Rualani

+0

。問題を更新したにもかかわらず、この問題は解決されました。問題はループロジックに関する質問に少し変わったので、これを閉じるべきですか? – Rualani

+0

更新されていないので、私はそれについてはわかりません。たぶん、私のソリューションが役立つかもしれない人がいるかもしれないので、わからない場合は閉じないでください。 –

0

私はわずかなコードしか変更しません。

def setShiftNum(self, num): 
    if num == 1 | 2: 
     self.__shiftNum = num 
    else: 
     print('Shift number needs to be a 1 or 2. Please try again') 
     self.setShiftNum(3) 

あなたは何をしたいのか分からないので、 あなたがself.setShiftNum(3)を知る必要があるすべては。あなたがちょうどあなたのロジックは、それが無限ループに実行させていることに注意してください。この

class he(): 
    def __init__(self, arg): 
     self.arg = arg 
    def sayHi(self): 
     print("hello") 
if __name__ == '__main__': 
    d = he("Ads") 
    d.sayHi() 
    # sayHi(d) 
関連する問題