我有一个基类:
class Animal(object):
def __init__(self, name=None, food=None):
self.name = name
self.food = food
def eat(self):
print "The %s eats some %s" % (self.name, self.food)
以及一个扩展它的类:
^{pr2}$假设我有一个Animal
对象,创建于此:
>>> fluffy_as_animal = Animal('dog', 'kibbles')
在python中有没有一种简单的方法可以从fluffy_as_animal
创建一个Pet
对象,而不是实际写出:
>>>> fluffy_as_pet = Pet(fluffy_as_animal.name, fluffy_as_animal.food)
我做这个实现的原因是我有一个类,它有一个函数,它返回一组Animal
类型的对象,所有这些对象我都想实际用作Pet
对象:
class AnimalStore(object):
def fetch(count, query=None, server=None, *args, **kwargs):
connection = connect_to_server(server)
resp = connection.fetch_animals(query)
objects = parse_response(resp)
animals = []
for a in objects[:count]:
animals.append(Animal(a['name'], a.['food']))
return animals
class PetStore(AnimalStore):
def fetch(count, query=None, server=None, *args, **kwargs):
query = 'type=pet AND %s' % query
animals = super(PetFactory, self).fetch(count, query, server, *args, **kwargs)
pets = []
for animal in animals:
pets.append(magic_function(animal))
return pets
AnimalStore
和PetStore
位于不同的模块中。AnimalStore
是标准Animal
API的一部分,不会改变。基本上,我想扩展Animal
API,方法是使用与动物相同的机制获取宠物列表,并且我希望能够利用动物API已经为其Animal
和AnimalStore
类提供的所有其他内置函数。在
您可以为
Pet
编写__init__()
以接受Animal
的实例(或者实际上,任何具有必要属性的ojbect——duck typing!)以及个人属性。然后你就可以做fluffy_as_pet = Pet(fluffy_as_animal)
。或者提供一个类方法(例如Pet.from_object()
)来执行相同的操作,如果您不想重载__init__()
。即使您不控制Animal
和Pet
类,您也可以根据需要为它们创建自己的子类。在但是,最好是更进一步,不要编写接受}的代码。那你就不必转换了。同样,duck类型——如果一个对象具有正确的属性,则可以使用它而不管它的类型是什么。在
Animal
而不是{我最后使用了委托(信用证应归于S.Lott):
我只希望我能正确地执行它;不管怎样,它都能工作!在
你可以的
或者
^{pr2}$但这两种方法可能更像是一种黑客行为,而不是一个干净的解决方案。在
相关问题 更多 >
编程相关推荐