根据__class__.__name__返回对象生成实例

0 投票
2 回答
2275 浏览
提问于 2025-04-16 21:11

我有一个超级类,简单起见我叫它“哺乳动物”,从这个类派生出了狗、猴子和熊这些类。这些类继承了一些方法,其中有些方法返回的对象需要和调用它们的类是同一种类。比如说,Dog.find(...) 应该返回狗的对象。但是因为 find() 方法是从“哺乳动物”这个类继承来的,所以这个方法不能直接写成 return Dog(...)。它需要根据 self.__class__.__name__ 的值来返回狗、猴子、熊或者哺乳动物的对象。

我用 return eval(self.__class__.__name__)(...) 实现了这个功能,但我更希望能避免使用 eval。有没有更好的方法呢?

2 个回答

3

使用 类方法 来创建一个工厂:

class Mammal(object):

    @classmethod
    def new(cls, *args, **kwds):
        return cls(*args, **kwds)

class Dog(Mammal):

    def find(self):
        return self.new()

>>> d = Dog()
>>> d2 = d.find()
>>> type(d2)
<class '__main__.Dog'>
3

你可以试试这个代码:return self.__class__()

撰写回答