Python - 继承一个已经初始化的 Class 而不调用超级构造函数
Python - Inherit an Already Initialized Class Without Calling Super Constructor
我正在尝试创建一个 Python 地名词典模块。我有以下 classes:州、县和市。我需要一个州了解其所有县,一个县了解其所有城市,以及一个城市了解其县和州。 (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'
我希望我的城市 class 使用州和县 class 的方法。我最好的猜测是代码 print(fl.miami_dade.richmond.state_name())
正在使用 City 实例中的属性而不是 State 实例中的属性执行 state_name()
方法。
我不明白我在这里做错了什么。 县 class 是否有可能继承已经初始化的州 class 的方法和属性?
更多信息:
我不想在城市和县做 super().__init__()
,例如a = City('Seattle', 'King', 'Washington')
因为以下。
我有 56 个州(包括美国领土)、3,234 个县和 163,252 个城市的数据。如果我让每个城市都有其县和州的副本,那将是一种内存浪费。另外,我有坐标为每个县(~20MB)形成一个多边形,平均县有~50个城市;如果每个城市都有副本,那就太棒了。
好的,这对于我正在做的事情来说不是一个好的结构,我正在改变它,但是当我不理解某些东西时我不喜欢它。我想了解这里发生了什么。
这是一个简化版本:
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("Florida" )).然后添加一个静态方法来检索正确的对象。
我正在尝试创建一个 Python 地名词典模块。我有以下 classes:州、县和市。我需要一个州了解其所有县,一个县了解其所有城市,以及一个城市了解其县和州。 (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'
我希望我的城市 class 使用州和县 class 的方法。我最好的猜测是代码 print(fl.miami_dade.richmond.state_name())
正在使用 City 实例中的属性而不是 State 实例中的属性执行 state_name()
方法。
我不明白我在这里做错了什么。 县 class 是否有可能继承已经初始化的州 class 的方法和属性?
更多信息:
我不想在城市和县做
super().__init__()
,例如a = City('Seattle', 'King', 'Washington')
因为以下。
我有 56 个州(包括美国领土)、3,234 个县和 163,252 个城市的数据。如果我让每个城市都有其县和州的副本,那将是一种内存浪费。另外,我有坐标为每个县(~20MB)形成一个多边形,平均县有~50个城市;如果每个城市都有副本,那就太棒了。
好的,这对于我正在做的事情来说不是一个好的结构,我正在改变它,但是当我不理解某些东西时我不喜欢它。我想了解这里发生了什么。
这是一个简化版本:
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("Florida" )).然后添加一个静态方法来检索正确的对象。