是否可以从父实例化实例化子类的实例而无需专门传递子类的名称?
在PHP中我可以做类似
的事情$instance = new static;
如何在Python中实现类似的结果?
class DatabaseObject:
@classmethod
def findByID(caller, ID):
query='SELECT * FROM {} LIMIT 1'.format(caller.tableName)
#dostuff
return Instance(stuff) #return the instance of the class that called this method
class Question(DatabaseObject):
tableName='questions'
class Answer(DatabaseObject):
tableName='answers'
q = Question.findByID(5)
a = Answer.findByID(5)
所以在这个例子中我想要的findByID方法返回的是Question类或Answer类的实例,具体取决于调用它的那个。
或者这种方法是否太可怕了,不应该这样做?
感谢。
答案 0 :(得分:5)
你不需要在python中做任何特殊的事情。
class DatabaseObject:
@classmethod
def findByID(self, ID):
# whatever
return self()
class Question(DatabaseObject):
tableName = 'questions'
class Answer(DatabaseObject):
tableName = 'answers'
print Question.findByID(5) # <__main__.Question instance at 0x109b1d638>
print Answer.findByID(5) # <__main__.Answer instance at 0x109b1d638>
答案 1 :(得分:1)
由于提供给classmethod的第一个参数将是类本身,因此您可以返回cls(stuff)
的实例:
class DatabaseObject:
@classmethod
def findByID(cls, ID):
query='SELECT * FROM {} LIMIT 1'.format(caller.tableName)
#dostuff
return cls(stuff) #return the instance of the class that called this method
如果您只有一个类方法findByID
,那么当然只需定义Question.__init__
和Answer.__init__
就更直接了。但是,如果您还有其他类方法,比如findByExam
,findByCourse
等,那么我认为您将适当地使用类方法来进行实例化的其他途径。