从Python中的基类对象创建对象

2024-10-01 09:41:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基类:

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

AnimalStorePetStore位于不同的模块中。AnimalStore是标准AnimalAPI的一部分,不会改变。基本上,我想扩展AnimalAPI,方法是使用与动物相同的机制获取宠物列表,并且我希望能够利用动物API已经为其AnimalAnimalStore类提供的所有其他内置函数。在


Tags: 对象nameselfnoneserverfooddefas
3条回答

您可以为Pet编写__init__()以接受Animal的实例(或者实际上,任何具有必要属性的ojbect——duck typing!)以及个人属性。然后你就可以做fluffy_as_pet = Pet(fluffy_as_animal)。或者提供一个类方法(例如Pet.from_object())来执行相同的操作,如果您不想重载__init__()。即使您不控制AnimalPet类,您也可以根据需要为它们创建自己的子类。在

但是,最好是更进一步,不要编写接受Animal而不是{}的代码。那你就不必转换了。同样,duck类型——如果一个对象具有正确的属性,则可以使用它而不管它的类型是什么。在

我最后使用了委托(信用证应归于S.Lott):

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)

class Pet(object):
    def __init__(self, animal=None):
        self.animal = animal

    def __getattr__(self, key):
        return getattr(self.animal, key)

    def __setattr__(self, key, value):
        return setattr(self.animal, key, value)

    def eat(self):
        return self.animal.eat()

    def pet(self):
        print "You pet the %s." % self.name

    def feed(self):
        print "You put some %s into the bowl." % self.food
        self.eat()

我只希望我能正确地执行它;不管怎样,它都能工作!在

你可以的

fluffy_as_pet = object.__new__(Pet)
fluffy_as_pet.__dict__ = fluffy_as_animal.__dict__.copy()

或者

^{pr2}$

但这两种方法可能更像是一种黑客行为,而不是一个干净的解决方案。在

相关问题 更多 >