from __future__ import print_function
class Employee:
def __init__(self, name, salary=0):
self.name = name
self.salary = salary
def giveRaise(self, percent):
self.salary = self.salary + (self.salary * percent)
def work(self):
print(self.name, "does stuff")
def __repr__(self):
return "<Employee: name=%s, salary=%s>" % (self.name, self.salary)
class Chef(Employee):
def __init__(self, name) :
Employee.__init__(self, name, 50000)
def work(self) :
print(self.name, "makes food")
class Server(Employee):
def __init__(self, name):
Employee.__init__(self, name, 40000)
def work(self):
print(self.name, "interfaces with customer")
class PizzaRobot(Chef):
def __init__(self, name):
Chef.__init__(self, name)
def work(self):
print(self.name, "makes pizza")
if __name__ == "__main__":
for klass in Employee, Chef, Server, PizzaRobot:
obj = klass(klass.__name__)
obj.work()
在上面的代码中,我无法理解最后3行的行为是klass是一个类还是它是一个类的实例。 如果它是一个类,那么下面的线是什么意思以及为什么需要它?
obj = klass(klass.__name__)
答案 0 :(得分:1)
如上所述,这里没有迭代器,而是一个类的元组。下面的循环将循环遍历每个类,并为每个类实例化一个新对象。
for klass in Employee, Chef, Server, PizzaRobot:
obj = klass(klass.__name__)
obj.work()
如果你看一下你的类定义,特别是每个类的__init__
- 函数,你会看到有一个位置参数name
:
class Chef(Employee):
def __init__(self, name): # <-- look here.
这意味着必须使用参数名称实例化每个类:
>>> john = Chef('John')
>>> print(john)
<Employee: name=John, salary=50000>
每个类都有一个__name__
属性,该属性是该类的已定义名称。例如,Chef.__name__
为Chef
:
>>> Chef.__name__
'Chef'
这与您为类定义的name
参数不同,因为这是一个内部属性,不应更改。
因此,行obj = klass(klass.__name__)
将为您循环的每个类创建一个对象,并为每个对象提供类__name__
属性作为位置参数name
。
您最终会得到四个Employee
,Chef
,Server
和PizzaRobot
类型的对象。根据我给出的例子,你不是像John
这样的人名,而是在课后命名它们。
>>> for klass in Employee, Chef, Server, PizzaRobot:
... print(klass.__name__)
...
Employee
Chef
Server
PizzaRobot
>>>