下面是我的代碼:
class Person():
def __init__(self,name):
self.name=name
self.pet=None
def print_name(self):
print(f"The person's name is {self.name}")
class Employee(Person):
raise_amt=1.04
def __init__(self,name,salary):
super(Employee,self).__init__(name)
self.salary=salary
def apply_raise(self):
self.salary=int(self.salary*self.raise_amt)
class Manager(Person):
def __init__(self,name,salary,employees=None):
super().__init__(name)
self.salar=salary
if employees==None:
self.employees=[]
else:
self.employees=employees
def add_emp(self,emp):
if emp not in self.employees:
self.employees.append(emp)
def print_emps(self):
for emp in self.employees:
emp.print_name()
當我嘗試使用以下代碼運行程式時,會彈出錯誤。
frank=Employee("Frank",120000)
john=Employee("John",10000)
sean=Manager("Sean",20000,frank)
sean.add_emp(john)
sean.print_emps()
我收到的錯誤是TypeError: argument of type 'Employee' is not iterable。但是,當我將方括號放在 周圍時[frank],錯誤就消失了。你能幫我理解原因嗎?
uj5u.com熱心網友回復:
正如其他人所說,在Manager類__init__方法中,您允許給出一個可選串列Employees。如果給出了這個串列,那么Manager實體會將它設定為employees變數,否則它將設定一個空串列。在您的情況下,您Manager使用的是實體Employee而不是串列來初始化類。
為未來...
我建議更改一些代碼樣式以幫助避免此類問題:
- 添加型別注釋。這不僅對您回讀代碼非常有用,它還使 linter 能夠在運行代碼之前捕獲型別錯誤。
- 添加更多空格。在運算子、變數、引數、函式等之間添加空格。它使閱讀代碼更容易。
- 使用關鍵字引數。在下面的示例中,更容易查看每個引數的用途,并且通過擴展,您可以
employees清楚地看到是一個串列。
from typing import Optional, List
class Manager(Person):
def __init__(self, name: str, salary: int, employees: Optional[List[Employee]] = None):
super().__init__(name)
self.salary = salary
if employees is None:
self.employees = []
else:
self.employees = employees
def add_emp(self, emp: Employee):
if emp not in self.employees:
self.employees.append(emp)
def print_emps(self):
for emp in self.employees:
emp.print_name()
然后當你呼叫類時:
frank = Employee(name="Frank", salary=120000)
sean = Manager(name="Sean", salary=20000, employees=[frank])
uj5u.com熱心網友回復:
Python 期望employees是一個專案串列,而不是單個專案。在“frank”周圍添加方括號將它從一個簡單的 Employee 物件變成一個 Employee 物件串列,其中第一項是“frank”。
您的__init__和add_emp方法之間有不同的代碼。在 中__init__,您將員工設定為指定的值(在您的情況下使其成為 Employee 物件),而在add_emp您使用append()中將值添加到現有值中,將變數維護為串列。
讓我們檢查一下您的代碼在此處實際執行的操作:
- 首先,您創建了兩個
Employee名稱(字串)和薪水(整數)的實體 - 然后,您創建一個 Manager,其中包含一個名稱、薪水和一個分配給的員工物件
self.employees - 然后檢查“John”員工是否在肖恩的員工變數中,但肖恩的員工變數不是員工串列,它只是一個員工(坦率地說)。您正在檢查john 是否在 frank 中,而不是john 是否在當前包含 frank 的專案串列中。
如果您只想在創建每個經理時傳遞一個員工,最好的解決__init__方法是更改您的方法,如下所示:
def __init__(self,name,salary,employees=None):
super().__init__(name)
self.salar=salary
self.employees = []
if employees:
self.employees.append(employees)
如果您想傳入多個員工,則完全按照您當前的方式執行,將串列傳遞給例如[frank]不frank傳遞給方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/396838.html
上一篇:Django/React/Firebase-上傳大檔案時出現CORS錯誤
下一篇:當我使用xcode使用真實的ios設備進行測驗時,react-native-push-notificationremote不顯示
