簡體   English   中英

在python中輸入類型

[英]Type casting in python

我在SO上看了類似的問題,但沒有一個回答我的問題。 對於Ex。 如何將實例強制轉換為派生類? 但答案似乎並不是我想要的。

這是我的情況。 我有類似Django的類結構

class Base:
     ...some stuff...

class Derived(Base):
     ...some more stuff...

現在,當我在Django中進行一些查詢時,我總是得到Base類的對象。

 baseobj = get_object_or_404(Base, id = sid)

在運行時,我還可以遇到具有一些額外屬性的“派生”對象。 我能夠弄清楚一個對象是Base還是派生的(Base類對象中有足夠的信息)。 但是我應該如何訪問僅在Derived類中出現的那些額外字段。 我無法貶低“基地” - >“衍生”。 我應該怎么處理?

編輯:

我解決了這個問題。 Django在另一個表中存儲Derived類的“附加屬性”。 因此,由於這行代碼而出現了問題。

baseobj = get_object_or_404(Base, id = sid)

baseobj將始終為Base類,並且不具有Derived類的任何屬性。 我必須進行額外的查詢以獲取Derived類對象。

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

Django-land 中的這種繼承對我來說就像多表繼承一樣。 根據文檔,假設所有內容都正確連接,您應該能夠:

baseobj.derived    # note: small 'd'

通常,我會說在這種情況下使用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")

編輯:但我能正確理解你的問題嗎? 答:沒有。哎呀!

編輯2:盡管如此,似乎上面的try-except塊的某些變化比訪問數據庫兩次更好,正如您編輯的問題所暗示的那樣。

我從來沒有在python中這樣做過。 看起來像代碼氣味,你有一個類型的實例,並需要知道對象的最派生類型。 您應該已經知道基於您正在使用的功能的類型。 也許如果您向我們展示了您正在使用的實際代碼,我們將能夠為您提供更好的解決方案。

檢查對象isDerivedTypeisDerivedType是,當您添加另一個派生類時,您必須修改基礎以檢查新的派生類型。 這打破了面向對象編程的模型。 如果其他人正在使用您的代碼並且他們決定從您的課程中派生出來,那么他們就無法有效地執行此操作。

嘗試盡可能使用派生類型。 Django中的繼承點是允許代碼重用和類之間的數據共享 - 而不是信息隱藏。

使用Derived類的“小寫”版本:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM