Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的类型转换_Python_Django_Inheritance - Fatal编程技术网

python中的类型转换

python中的类型转换,python,django,inheritance,Python,Django,Inheritance,我看了一个类似的问题,但没有一个能回答我的问题。例如。但答案似乎不是我想要的 这是我的情况。我有一个类似于Django的类结构 class Base: ...some stuff... class Derived(Base): ...some more stuff... 现在,当我在Django中进行一些查询时,我总是得到基类的对象 baseobj = get_object_or_404(Base, id = sid) 在运行时,我还可能遇到具有一些额外属性的“派生”

我看了一个类似的问题,但没有一个能回答我的问题。例如。但答案似乎不是我想要的

这是我的情况。我有一个类似于Django的类结构

class Base:
     ...some stuff...

class Derived(Base):
     ...some more stuff...
现在,当我在Django中进行一些查询时,我总是得到基类的对象

 baseobj = get_object_or_404(Base, id = sid)
在运行时,我还可能遇到具有一些额外属性的“派生”对象。我能够确定对象是基对象还是派生对象(基类对象中有足够的信息)。但我应该如何访问那些仅在派生类中存在的额外字段呢。我无法向下转换“Base”->“Derived”。我该怎么处理

编辑:

我解决了这个问题。Django将派生类的“附加属性”存储在单独的表中。因此,由于这一行代码,出现了问题

baseobj = get_object_or_404(Base, id = sid)
baseobj始终是基类,并且不具有派生类的任何属性。我必须进行额外的查询以获取派生类对象

baseobj = get_object_or_404(Base, id = sid)
if baseobj.isDerivedType:
      derivedobj = get_object_or_404(Derived, id = sid)

通常,我会说在这种情况下使用try-except子句是很典型的

class thing1(object):
    def __init__(self):
        self.a = 5

class thing2(thing1):
    def __init__(self):
        super(thing2, self).__init__()
        self.b = 6

t = thing1()
try: 
    print(t.b)
except AttributeError: 
    print("handling the exception")
编辑:但我对你的问题理解正确吗? 回答:不,哎呀


EDIT2:尽管如此,正如您编辑的问题所表明的,上面的try-except块的一些变体似乎比访问数据库两次要好

我觉得Django土地上的这种遗产很有味道。根据该文件,假设所有连接都正确,您应该能够:

baseobj.derived    # note: small 'd'

我从来没有在python中这样做过。您有一个类型的实例,并且需要知道对象的最派生类型,这似乎是一种代码味道。您应该已经知道基于所使用函数的类型。也许如果您向我们展示您正在使用的实际代码,我们将能够帮助您找到更好的解决方案

检查对象
isDerivedType
的问题在于,当您添加另一个派生类时,您必须修改基类以检查新的派生类型。这打破了面向对象编程的模式。如果其他人正在使用您的代码,并且他们决定从您的类派生代码,那么他们就不能有效地这样做

尽可能多地使用派生类型。Django中的继承点是允许代码重用和类之间的数据共享,而不是信息隐藏。

使用派生类的“小写”版本:

class Base:
     base_attribute

class Derived(Base):
     derived_attribute

baseobj = get_object_or_404(Base, id = sid)
if baseobj.isDerivedType:
     print baseobj.derived.derived_attribute

有什么原因不能直接
获取\u object\u或\u 404(派生的,id=sid)
?不需要在Python中“强制转换”。Python中的对象是。不,我不能。我不知道哪个“sid”属于基属性还是派生属性。@santa-如果我尝试访问某些派生属性,则会出错<代码>“'Base'对象没有'DerivedProperty'属性。@Neo:我感觉您正在Django的ORM中实现一个,对吗?”?你看过它的文档了吗?应该是
try:t.b=6
?如前所述,不会发生异常。如果try/except都在各自的线路上,那么您的代码将更容易阅读。@Velocirapts,是的,我意识到了这一点,并修复了它,但我想在您之前没有!另外,将try/except块放在它们自己的行上。谢谢我会尝试类似的方法,在try-catch中包装
get\u-object\u或\u 404(派生,id=sid)
。首先尝试将其作为
派生的
检索,如果检索失败,则将其作为
加载。不过,设计应用程序时最好让不同类型的对象使用单独的主键空间。@senderle-区分“thing1”和“thing2”不是问题。我可以确定哪个对象是哪个类,“thing1”对象本身有足够的信息。但是一旦我确定t是thing2类型,我如何访问'thing2'的属性呢?如果你知道t是thing2,为什么你不能直接访问它们呢?另外,上面代码的要点是,你不必事先知道你是在处理第1件事还是第2件事。欢迎。这样就可以了,但是请注意,您的解决方案还将产生可能不必要的额外数据库访问成本。此解决方案不会影响数据库吗?