[英]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)
通常,我會說在這種情況下使用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中這樣做過。 看起來像代碼氣味,你有一個類型的實例,並需要知道對象的最派生類型。 您應該已經知道基於您正在使用的功能的類型。 也許如果您向我們展示了您正在使用的實際代碼,我們將能夠為您提供更好的解決方案。
檢查對象isDerivedType
為isDerivedType
是,當您添加另一個派生類時,您必須修改基礎以檢查新的派生類型。 這打破了面向對象編程的模型。 如果其他人正在使用您的代碼並且他們決定從您的課程中派生出來,那么他們就無法有效地執行此操作。
嘗試盡可能使用派生類型。 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.