多重继承、验证、python
我有一对类(Substance和Region),我希望为一个公共子类(Population)保存查找值,如图所示。我想确保只能基于两个父类Substance和Region的现有实例创建人口实例。我的代码(显然)不能按我想要的方式工作,我已经摆弄了一段时间,想出了各种各样的坏主意:包括全局变量、将东西分解成模块、到处都是意大利面条!这似乎应该很容易以明确和直接的方式做到。有什么想法吗?(不,我不认为多重继承在这里是正确的,但这是我最近的尝试…) 试试这个:多重继承、验证、python,python,validation,inheritance,lookup,Python,Validation,Inheritance,Lookup,我有一对类(Substance和Region),我希望为一个公共子类(Population)保存查找值,如图所示。我想确保只能基于两个父类Substance和Region的现有实例创建人口实例。我的代码(显然)不能按我想要的方式工作,我已经摆弄了一段时间,想出了各种各样的坏主意:包括全局变量、将东西分解成模块、到处都是意大利面条!这似乎应该很容易以明确和直接的方式做到。有什么想法吗?(不,我不认为多重继承在这里是正确的,但这是我最近的尝试…) 试试这个: class Population(Sub
class Population(Substance, Regime):
def __init__(self, subs, reg, qty):
#Etc...
为什么不这样做:
pop = population(substance_dict['H'], regime_dict['S1'], 1000)
也就是说,不是传递物质和制度的标签,而是传递实际的物质和制度对象。为了解决这个问题,您可能需要在
Population
中对代码进行一些调整,因为现在它应该需要一个Subtance和一个region,而不是两个字符串,但我认为这在概念上要简单得多。好的,下面是我想要的正确方法,谢谢您的评论
class Substance:
def __init__(self, symbol, name):
self.symbol = symbol
self.name = name
class Regime:
def __init__(self, symbol, name):
self.symbol = symbol
self.name = name
class Population(Substance, Regime):
def __init__(self, subs, reg, qty):
self.subs = subs
self.reg = reg # this should validate against regime_dict
self.qty = qty
self.key = subs.symbol+reg.symbol
s1 = Substance('H', 'hydrogen')
s2 = Substance('C', 'carbon')
reg = Regime('S1', 'Surface 1')
pop = Population(s1, reg, 1000)
print pop.subs.symbol
print pop.reg.symbol
print pop.key
如果您需要强制执行
人口
接收一个制度
和一个物质
,我会尝试以下方法:
class Substance(object):
def __init__(self, name):
self.name = name
class Regime(object):
def __init__(self, name):
self.name = name
class Population(object):
def __init__(self, subs, reg, qty):
if not isinstance(subs, Substance):
raise TypeError("subs must be a Substance")
if not isinstance(reg, Regime):
raise TypeError("reg must be a Regime")
self.subs = subs
self.reg = reg # this should validate against regime_dict
self.qty = qty
substance_dict = {'H' : Substance('hydrogen'),
'C': Substance('carbon')}
regime_dict = {'S1': Regime('Surface 1'),
'S2': Regime('Surface 2')}
pop = Population(substance_dict['H'], regime_dict['S1'], 1000)
pop_break = Population(substance_dict['H'], substance_dict['C'], 1000)
class Population(object):
def __init__(self, subs, reg, qty):
if not isinstance(subs, Substance):
raise TypeError("subs must be a Substance")
if not subs in substance_dict.values():
raise ValueError("subs %s is not in the substance_dict" % subs.name)
if not isinstance(reg, Regime):
raise TypeError("reg must be a Regime")
if not reg in regime_dict.values():
raise ValueError("reg %s is not in the regime_dict" % reg.name)
self.subs = subs
self.reg = reg # this should validate against regime_dict
self.qty = qty
substance_dict = {'H' : Substance('hydrogen'),
'C': Substance('carbon')}
regime_dict = {'S1': Regime('Surface 1'),
'S2': Regime('Surface 2')}
pop = Population(substance_dict['H'], regime_dict['S1'], 1000)
pop_break = Population(Substance('radon'), substance_dict['C'], 1000)
如果您还想验证参数是否在字典中,请使用以下方法:
class Substance(object):
def __init__(self, name):
self.name = name
class Regime(object):
def __init__(self, name):
self.name = name
class Population(object):
def __init__(self, subs, reg, qty):
if not isinstance(subs, Substance):
raise TypeError("subs must be a Substance")
if not isinstance(reg, Regime):
raise TypeError("reg must be a Regime")
self.subs = subs
self.reg = reg # this should validate against regime_dict
self.qty = qty
substance_dict = {'H' : Substance('hydrogen'),
'C': Substance('carbon')}
regime_dict = {'S1': Regime('Surface 1'),
'S2': Regime('Surface 2')}
pop = Population(substance_dict['H'], regime_dict['S1'], 1000)
pop_break = Population(substance_dict['H'], substance_dict['C'], 1000)
class Population(object):
def __init__(self, subs, reg, qty):
if not isinstance(subs, Substance):
raise TypeError("subs must be a Substance")
if not subs in substance_dict.values():
raise ValueError("subs %s is not in the substance_dict" % subs.name)
if not isinstance(reg, Regime):
raise TypeError("reg must be a Regime")
if not reg in regime_dict.values():
raise ValueError("reg %s is not in the regime_dict" % reg.name)
self.subs = subs
self.reg = reg # this should validate against regime_dict
self.qty = qty
substance_dict = {'H' : Substance('hydrogen'),
'C': Substance('carbon')}
regime_dict = {'S1': Regime('Surface 1'),
'S2': Regime('Surface 2')}
pop = Population(substance_dict['H'], regime_dict['S1'], 1000)
pop_break = Population(Substance('radon'), substance_dict['C'], 1000)
当您尝试创建pop_break时,您将收到一个异常:
Traceback (most recent call last):
File "./stack7_1.py", line 29, in <module>
pop_break = Population(Substance('radon'), substance_dict['C'], 1000)
File "./stack7_1.py", line 14, in __init__
raise ValueError("subs %s is not in the substance_dict" % subs.name)
ValueError: subs radon is not in the substance_dict
既然字典的
物质('hydrogen')
与总体(物质('hydrogen')的物质('hydrogen')
是不同的实例,…)
为什么不传入实际的物质/制度对象,而不是映射到它们的字符串?是的!那怎么办?不再听写了?传递给类群体的小写实体和制度是什么?你真的想群体从子部分和制度继承吗?只有当你认为人口是一种物质,是一种制度时,你才应该这样做。如果不是,则不继承,只需传入值。否不是。。。从这些类继承时,您将覆盖Population
中的symbol
和name
。你为什么从物质和制度继承人口?