根据__class__.__name__返回对象生成实例
我有一个超级类,简单起见我叫它“哺乳动物”,从这个类派生出了狗、猴子和熊这些类。这些类继承了一些方法,其中有些方法返回的对象需要和调用它们的类是同一种类。比如说,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__()