类实例覆盖属性

2024-09-29 23:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了一个用于计算的类,它看起来像:

default = {…}

class Case(object):
    def __init__(self, name, wt, wd, ft, bc, burnup, cr_state):
        self.name = name
        self.burnup = burnup
        self.infn = 'fa-'+faType+'-'+str(self.burnup)+'-'+self.name
        self.data = default
        self.data['caseName'] = name
        self.data['water-temp'] = str(wt)
        self.data['water-den'] = str(wd)
        self.data['fuel-temp'] = str(ft)
        self.data['boron-con'] = str(bc)
        self.cr_state = cr_state
        self.data['cr_state'] = cr_state
        self.data['burnup'] = str(burnup)

实际上,它实现了更多的方法,但这应该足以说明。你知道吗

问题是,当我尝试创建这个类的不同实例时,它们的属性是相同的,比如:

basis = Case('basis', 578.0, 0.71614, 578.0, 0.00105, 0, 'empty')
wt450 = Case('wt450', 450.0, 0.71614, 578.0, 0.00105, 0, 'empty')

在这之后如果我检查一下:

print basis.data == wt450.data

它返回True。问题的根源在哪里?你知道吗


Tags: nameselfdefaultdatabasiscrstatecase
1条回答
网友
1楼 · 发布于 2024-09-29 23:21:29

像jornsharpe states的注释一样,您可以用`口述副本方法。你知道吗

class Case(object):
    def __init__(self, name, wt, wd, ft, bc, burnup, cr_state):
        self.name = name
        self.burnup = burnup
        self.infn = 'fa-'+faType+'-'+str(self.burnup)+'-'+self.name
        # Copy the content of the dict
        self.data = default.copy()
        # Overwrite data's default values
        self.data['caseName'] = name
        self.data['water-temp'] = str(wt)
        self.data['water-den'] = str(wd)
        self.data['fuel-temp'] = str(ft)
        self.data['boron-con'] = str(bc)
        self.cr_state = cr_state
        self.data['cr_state'] = cr_state
        self.data['burnup'] = str(burnup)

或者,如果要保持值与默认值同步,可以创建一个方法,从实例中获取值,如果找不到值,则使用默认dict上的值。该方法如下所示:

class Case(object):
    def __init__(self, name, wt, wd, ft, bc, burnup, cr_state):
        self.name = name
        self.burnup = burnup
        self.infn = 'fa-'+faType+'-'+str(self.burnup)+'-'+self.name
        # We create a NEW dictionary to hold the overwritten values
        self.data = {}
        # Write data to OUR OWN dict
        self.data['caseName'] = name
        self.data['water-temp'] = str(wt)
        self.data['water-den'] = str(wd)
        self.data['fuel-temp'] = str(ft)
        self.data['boron-con'] = str(bc)
        self.cr_state = cr_state
        self.data['cr_state'] = cr_state
        self.data['burnup'] = str(burnup)
    def property(name):
        """
        Return the value of `name`, if name wasn't defined, then use the
        value from default.
        """
        # Return the property from our own dict. If it can't find the property
        # then get it from the default dict. If the property doesn't exists
        # returns None.
        return self.data.get(name, default.get(name))

# Then
print basis.property('caseName') == wt450.property('caseName')
> False

相关问题 更多 >

    热门问题