理解这个Python脚本

时间:2014-08-21 20:17:34

标签: python python-3.x

我收到了这段代码,我试图找出其工作原理

class Animal(object):
    population = 0
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "I am an instance of {}. ".format(self.__class__, self.name)
    def __repr__(self):
        return self.__str__()

    def make_sound(self):
        return "{} is trying to speak, but its method doesn't do much".format(self.name)

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed
    def __str__(self):
        print(super().__str__())
        return "My breed is {}".format(self.breed)

    def make_sound(self):
        return "{} says woof!".format(self.name)

class Cat(Animal):
    pass


animals = {'Felix': ('Cat', None), 'Fido': ('Dog', 'mutt'), 'Charlie': ('Dog', 'spaniel')}
animals_list = []
for k in animals:
    if animals[k][1]:
        animals_list.append(globals()[animals[k][0]](k, animals[k][1]))
    else:
        animals_list.append(globals()[animals[k][0]](k))
    Animal.population+=1

for animal in animals_list:
    print(animal)
    print(animal.make_sound())
print("Animal population is {}".format(Animal.population))

课程是如何开始的?我无法理解这是如何完成的,似乎当脚本到达if动物部分时,已经启动了类狗和猫。

提前致谢

1 个答案:

答案 0 :(得分:1)

这些类在for循环中实例化:

for k in animals:
    if animals[k][1]:
        animals_list.append(globals()[animals[k][0]](k, animals[k][1]))  # Instantiates a class
    else:
        animals_list.append(globals()[animals[k][0]](k))  # Instantiates a class

因此,如果k'Felix',则此代码会说:

if None: # Because animals['Felix'][1] is None
    animals_list.append(globals()['Cat']('Felix', None))
else:
    animals_list.append(globals()['Cat']('Felix'))

globals()返回包含名称的字典 - >全局命名空间中所有变量的对象映射。因此,globals()['Cat']会返回实际的Cat类。这意味着globals()['Cat']('Felix')相当于Cat('Felix')。显然,这是使用名称Cat实例化'Felix'类。对animals dict中的每个条目重复相同的模式,因此最后,animals_list包含通过调用Cat('Felix')Dog('Fido', 'mutt')和{{1}返回的实例。 }。

对于它的价值,我同意那些指出这段代码非常难看的评论家。这样做更有意义:

Dog('Charlie', 'spaniel')

无需使用animals = {'Felix': (Cat, None), 'Fido': (Dog, 'mutt'), 'Charlie': (Dog, 'spaniel')} animals_list = [] for k in animals: if animals[k][1]: animals_list.append(animals[k][0](k, animals[k][1])) else: animals_list.append(animals[k][0](k))