Python 从父级实例化子级

Python 从父级实例化子级,python,Python,是否可以从父类实例化子类的实例,而无需专门传递子类的类名 在PHP中,我可以执行以下操作 $instance = new static; 如何在Python中实现类似的结果 class DatabaseObject: @classmethod def findByID(caller, ID): query='SELECT * FROM {} LIMIT 1'.format(caller.tableName) #dostuff re

是否可以从父类实例化子类的实例,而无需专门传递子类的类名

在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方法返回的是一个问题类或答案类的实例,具体取决于调用它的是哪一个

或者这种方法很可怕,不应该这样做


谢谢。

因为提供给classmethod的第一个参数将是类本身,所以您可以使用
cls(stuff)
返回一个实例:


如果您只有一个classmethod
findByID
,那么定义
问题当然会更直接。但是如果你也有其他的类方法,比如,
findByExam
findByCourse
,那么我认为你应该适当地使用类方法来创建其他的实例化途径。

因为提供给类方法的第一个参数是类本身,你可以使用
cls(stuff)
返回一个实例:


如果您只有一个classmethod
findByID
,那么定义
问题当然会更直接。但是如果你也有其他的类方法,比如说,
findByExam
findByCourse
,那么我认为你应该适当地使用类方法来创建其他的实例化途径。

你不需要在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>
类数据库对象:
@类方法
def findByID(自身,ID):
#随便
返回自我()
课堂问题(数据库对象):
tableName='questions'
类答案(数据库对象):
tableName='answers'
打印问题。findByID(5)#
打印答案。findByID(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>
类数据库对象:
@类方法
def findByID(自身,ID):
#随便
返回自我()
课堂问题(数据库对象):
tableName='questions'
类答案(数据库对象):
tableName='answers'
打印问题。findByID(5)#
打印答案。findByID(5)#

@classmethod
s中使用
cls
不是更惯用吗?@Eric:我不知道。真的吗?在
@classmethod
s中使用
cls
不是更惯用吗?@Eric:我不知道。真的吗?