我收到了这段代码,我试图找出其工作原理
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动物部分时,已经启动了类狗和猫。
提前致谢
答案 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))
。