You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:19:10