如何在python中设置.__ name__?

时间:2013-09-20 08:45:58

标签: python attributes

我正在尝试解决这个问题:

  

返回一个表示多项式的函数   系数。

     

例如,如果coefs=(10, 20, 30),则返回计算的x函数   30 * x**2 + 20 * x + 10。同时将coefs存储在.coefs属性上    .__name__属性中的函数和公式的str。

这是我的解决方案:

def poly(coefs):
    #write the string name
    l=len(coefs)
    coefs=reversed(coefs)
    j=0
    name=""
    for i in coefs:
        if j<l-2:
            name=name+str(i)+" * x**"+str(l-j-1)+" + "
        elif j==l-2:
            name=name+str(i)+" * x + "
        else:
            name=name+str(i)
        j=j+1
    def calc(x):
        name.replace("x",str(x))
        calc.__name__=name
        return eval(name)



    return calc

效果不佳。

>>> p=poly((1,2,3))
>>> p
<function calc at 0x3b99938> #the name of p is not what I want!!! (*)
>>> y=p(3)
>>> p
<function 3 * x**2 + 2 * x + 1 at 0x3b99938> # now this is right!
>>> 

如何在第一次通话中使用正确的名称(*)?

1 个答案:

答案 0 :(得分:3)

设置功能对象的名称​​在之外:

def calc(x):
    newname = name.replace("x", str(x))
    calc.__name__ = newname
    return eval(name)

calc.__name__ = name
return calc

请注意,str.replace()不会替换字符串中的值。它返回改变的字符串,字符串值本身是不可变的。

您的初始名称必须使用x,因为在您致电x时未知poly()的值。我会在名称中留下 out 填写x;当您下次使用不同的x调用该函数时,该函数将不会返回该精确计算。每次调用该函数时,不用替换名称中的xcalc()只会是:

def calc(x):
    return eval(name)

name = ''功能的 top 处添加poly(),并且每个呼叫的名称更改仍然存在,提供:

>>> p = poly((1,2,3))
>>> p
<function 3 * x**2 + 2 * x + 1 at 0x10ecf5488>
>>> p(3)
34
>>> p
<function 3 * 3**2 + 2 * 3 + 1 at 0x10ecf5488>