簡體   English   中英

Python-繼承一個已初始化的類而不調用超級構造函數

[英]Python - Inherit an Already Initialized Class Without Calling Super Constructor

我正在嘗試創建一個Python地名詞典模塊。 我有以下課程:州,縣和市。 我需要一個州來了解其所有縣,一個縣要了解其所有城市,以及一個市要了解其縣和州。 (Python 3.x)

這是我所擁有的:

class State(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    def state_name(self):
        return self.state


class County(State):
    def __init__(self, state_class, **kwargs):
        self.__bases__ = (state_class, )
        self.__dict__.update(kwargs)


class City(County):
    def __init__(self, county_class, **kwargs):
        self.__bases__ = (county_class, )
        self.__dict__.update(kwargs)

然后我做:

fl = State(state='Florida', abb='FL', fips='12')
mdc = County(fl, county='Miami-Dade', fips='086')
setattr(fl, 'miami_dade', mdc)
rmd = City(mdc, city='Richmond', fips='60230')
setattr(mdc, 'richmond', rmd)


print(fl.state, fl.abb, fl.fips, fl.miami_dade.county, fl.miami_dade.richmond.city)
# Florida FL 12 Miami-Dade Richmond
print(fl.state_name())
# Florida
print(fl.__dict__)
# {'abb': 'FL', 'miami_dade': <__main__.County object at 0x0000000002C44A20>, 'fips': '12', 'state': 'Florida'}
print(fl.miami_dade.__dict__)
# {'__bases__': (<__main__.State object at 0x000000000358A048>,), 'fips': '086', 'county': 'Miami-Dade', 'richmond': <__main__.City object at 0x0000000002C44A90>}
print(fl.miami_dade.richmond.__dict__)
# {'fips': '60230', 'city': 'Richmond', '__bases__': (<__main__.County object at 0x0000000002C44A20>,)}
print(isinstance(fl.miami_dade.richmond, State))
# True

到目前為止一切都很好...但是:

print(fl.miami_dade.richmond.state_name())
# AttributeError: 'City' object has no attribute 'state'

我希望我的城市班級在州和縣班級中使用方法。 我最好的猜測是代碼print(fl.miami_dade.richmond.state_name())使用City實例中的屬性而不是State實例中的屬性執行state_name()方法。

我不明白我在做什么錯。 縣級類甚至可能繼承已經初始化的州級類的方法和屬性嗎?


更多信息:
我不想在City和County做super().__init__() ,例如a = City('Seattle', 'King', 'Washington')原因如下。
我有56個州(包括美國領土),3,234個縣和163,252個城市的數據。 如果我讓每個城市都有其縣和州的副本,那將是在浪費記憶。 另外,我有一個坐標,每個縣都有一個多邊形(約20MB),平均每個縣有約50個城市。 如果每個城市都有副本,那將超過Gig。


好的,對於我正在做的事情來說,這不是一個好的結構,我正在對其進行更改,但是當我不了解某些內容時,我不喜歡它。 我想了解這里發生了什么。
這是一個簡化的版本:

 class A: def __init__(self, name): self.name = name def getA(self): return self.name class B(A): def __init__(self, aname, bname): self.name = bname super().__init__(aname) b = B('AAA', 'BBB') print(b.getA()) # AAA 

好吧,我明白了。 但是然后在這里:

 class A2: def __init__(self, name): self.name = name def getA2(self): return self.name class B2(A2): def __init__(self, A2Obj, name): self.__bases__ = (A2Obj, ) self.name = name a2 = A2('AAA2') b2 = B2(a2, 'BBB2') print(b2.getA2()) # BBB2 print(a2.name) # AAA2 

a2知道其名稱為AAA2。 為什么b2.getA2()給我BBB2? 就像b2繼承了a2的方法,但沒有繼承屬性。 如何使b2行為像上面的示例?

您可能使用了錯誤的結構:您的城市不是縣,縣不是州。 您應該使用合成而不是推導

class State(object):
  def __init__(self, **kwargs):
    self.__dict__.update(kwargs)

  def state_name(self):
    return self.state


class County(object):
  def __init__(self, state, **kwargs):
    self.state=state # this will just reference the state object
    self.__dict__.update(kwargs)
  def getStateName(self):
    return self.state.state


class City(object):
  def __init__(self, county, **kwargs):
    self.county = county
    self.__dict__.update(kwargs)
  def getStateName(self):
    return self.county.getStateName()

如果您希望以后無需對對象進行跟蹤就可以檢索它們,則可以使用靜態字典並在初始化期間添加創建的對象(例如“ FL”-> State(“佛羅里達”))。 然后添加靜態方法以檢索正確的對象。

暫無
暫無

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

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