多重继承、验证、python

多重继承、验证、python,python,validation,inheritance,lookup,Python,Validation,Inheritance,Lookup,我有一对类(Substance和Region),我希望为一个公共子类(Population)保存查找值,如图所示。我想确保只能基于两个父类Substance和Region的现有实例创建人口实例。我的代码(显然)不能按我想要的方式工作,我已经摆弄了一段时间,想出了各种各样的坏主意:包括全局变量、将东西分解成模块、到处都是意大利面条!这似乎应该很容易以明确和直接的方式做到。有什么想法吗?(不,我不认为多重继承在这里是正确的,但这是我最近的尝试…) 试试这个: class Population(Sub

我有一对类(Substance和Region),我希望为一个公共子类(Population)保存查找值,如图所示。我想确保只能基于两个父类Substance和Region的现有实例创建人口实例。我的代码(显然)不能按我想要的方式工作,我已经摆弄了一段时间,想出了各种各样的坏主意:包括全局变量、将东西分解成模块、到处都是意大利面条!这似乎应该很容易以明确和直接的方式做到。有什么想法吗?(不,我不认为多重继承在这里是正确的,但这是我最近的尝试…)

试试这个:

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
。你为什么从物质和制度继承人口?