[英]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()
方法。
我不明白我在做什么錯。 縣級類甚至可能繼承已經初始化的州級類的方法和屬性嗎?
super().__init__()
,例如a = City('Seattle', 'King', 'Washington')
原因如下。
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.