多个参数值

2024-04-26 01:19:51 发布

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

我刚刚开始用面向对象的python编程(如果这是一个愚蠢的问题,请原谅我)。我正在使用一个模型,它使用一个函数来模拟大气中二氧化碳排放的衰减。对于每个timestep,类Emissionc_size属性应该使用decay函数减小

我已将代码简化为一次运行,但不断出现错误:

Traceback (most recent call last):
File "<co2>", line 20, in <module>
x.decay(year=1) 
TypeError: decay() got multiple values for argument 'year'

我看不出多个值是从哪里来的。我只向代码传递一个int值。你知道吗

代码是:

import numpy as np

class Emission:
    def __init__(self,e_year=0, e_size=0.0):
        self.e_year=e_year #emission year
        self.e_size=e_size #emission size
        self.c_size=[e_size] #current size

    def decay(year):
        #returns a % decay based on the year since emission 0 = 100% 1 = 93%
        # etc. from AR5 WG1 Chapter 8 supplementary material equation 8.SM.10
        # using coefficients from table 8.SM.10
        term1 = 0.2173
        term2 = 0.224*np.exp(-year/394.4)
        term3 = 0.2824*np.exp(-year/36.54)
        term4 = 0.2763*np.exp(-year/4.304)
        out = (term1+term2+term3+term4)*self.e_size
        self.c_size.append(out)
        print(self.c_size)

x = Emission(e_year=1,e_size=10.0)
x.decay(year=1)

Tags: term1函数代码fromselfsizedefnp
2条回答

类方法的第一个参数应该是self。你知道吗

class Emission:
    def __init__(self,e_year=0, e_size=0.0):
        self.e_year=e_year #emission year
        self.e_size=e_size #emission size
        self.c_size=[e_size] #current size

    def decay(self, year):
        #returns a % decay based on the year since emission 0 = 100% 1 = 93% etc. from AR5 WG1 Chapter 8 supplementary material equation 8.SM.10 using coefficients from table 8.SM.10
        term1 = 0.2173
        term2 = 0.224*np.exp(-year/394.4)
        term3 = 0.2824*np.exp(-year/36.54)
        term4 = 0.2763*np.exp(-year/4.304)
        out = (term1+term2+term3+term4)*self.e_size
        self.c_size.append(out)
        print(self.c_size)

您忘记了decay的方法签名中的self,因此Python尝试将实例作为第一个参数插入(即year),您还显式地传递了year,导致了参数冲突。你知道吗

所以只需将方法定义更改为:

def decay(self, year):

重要的是要认识到,方法的第一个参数的名称self只是一个约定。如果您将它命名为year(尽管您必须为第二个参数找到不同的名称),或者thisthe_instance,它也可以工作。重要的是,在调用方法时,实例作为第一个参数隐式地传递给方法。你知道吗

所以这也会起作用:

def decay(blabla, year):
    term1 = 0.2173
    term2 = 0.224*np.exp(-year/394.4)
    term3 = 0.2824*np.exp(-year/36.54)
    term4 = 0.2763*np.exp(-year/4.304)
    out = (term1+term2+term3+term4)*blabla.e_size
    blabla.c_size.append(out)
    print(blabla.c_size)

但这违反了常见的Python约定,我必须用blabla更改方法中的所有self。你知道吗


进一步评论:

如果您专门将标量作为year处理,那么您可能应该使用math.exp而不是numpy.exp,因为它要快得多。但是math.exp只对标量有效,所以如果你想对year使用列表或数组,你必须使用numpy.exp。你知道吗

相关问题 更多 >