私は現時点で継承と多型について学習しており、このコードはこれらの概念をテストすることになっています。サブクラスオブジェクトをインスタンス化しようとすると、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の入力に従順を要求します
この時点では私は状況の論理に固執しているので、私は解決策に近いと思う。私は論理がかなり貧弱だと感じています。アルゴリズムの複雑さですが、現時点では動作したいだけです。
'self.setShiftNum(num)'を試してください。 –
また、無限の再帰があることに注意してください。再帰的な設定は設計が貧弱です。その代わりに、例外がスローされるか、そうでなければ不正なパラメータが示されます。呼び出し側はエラーを処理します。 –
ここにいくつかのアイデアがあります。 http://stackoverflow.com/a/23294659/2823755 – wwii