Python类方法调用报错:AttributeError与TypeError问题求助
咱们一步步来看你遇到的两个问题,都是很容易修正的小细节~
第一个错误:TypeError: ytm() got an unexpected keyword argument 'price'
你的ytm()方法只默认接收self参数,它的逻辑是直接读取你创建BondPricing实例时初始化的属性值来计算到期收益率。所以你不能在调用ytm()的时候传入price、par这类参数——这些参数是给类的__init__构造方法用的,不是给ytm()用的。
如果想用不同的参数计算YTM,有两种可行方式:
- 方式1:创建实例时直接传入目标参数
# 把需要的参数在实例化时传给__init__ bond1 = BondPricing(price=95.0428, par=100, T=1.5, coup_perc=5.75, freq=2) print(bond1.ytm()) # 直接调用ytm,不用额外传参数 - 方式2:修改已有实例的属性后再调用
bond1 = BondPricing() # 先用默认值创建实例 # 修改需要调整的属性 bond1.price = 95.0428 bond1.par = 100 bond1.T = 1.5 # 其他属性同理修改后,调用ytm print(bond1.ytm())
第二个错误:AttributeError: 'BondPricing' object has no attribute 'ymt'
这是一个典型的拼写失误!你在类里定义的方法是ytm()(Yield to Maturity的缩写),但调用的时候写成了ymt(),把字母t和m的顺序搞反了。修正拼写就能解决:
bond1.ytm() # 正确方法名是ytm,不是ymt
完整修正后的代码示例
import scipy.optimize as optimize class BondPricing: def __init__(self, price=95.0428, par=100, T=1.5, freq=2, coup_perc=5.75, dy=0.01, guess=0.05): self.price = price self.par = par self.T = T self.freq = freq self.coup_perc = coup_perc self.dy = dy self.guess = guess def ytm(self): freq = float(self.freq) periods = self.T * freq coupon = self.coup_perc / 100. * self.par / freq dt = [(i+1)/freq for i in range(int(periods))] ytm_func = lambda y: sum([coupon/(1+y/self.freq)**(self.freq*t) for t in dt]) + self.par/(1+y/self.freq)**(self.freq*self.T) - self.price return optimize.newton(ytm_func, self.guess) # 示例1:实例化时传参 bond1 = BondPricing(price=95.0428, par=100, T=1.5, coup_perc=5.75, freq=2) print(bond1.ytm()) # 示例2:修改实例属性后计算 bond2 = BondPricing() bond2.price = 90.0 print(bond2.ytm())
内容的提问来源于stack exchange,提问作者Vitomir
相关产品推荐
相关产品推荐

