无法理解迭代器在类上的工作原理

时间:2014-05-05 07:39:30

标签: python class inheritance

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__) 

1 个答案:

答案 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

您最终会得到四个EmployeeChefServerPizzaRobot类型的对象。根据我给出的例子,你不是像John这样的人名,而是在课后命名它们。

>>> for klass in Employee, Chef, Server, PizzaRobot:
...     print(klass.__name__)
...    
Employee
Chef
Server
PizzaRobot
>>>