将类函数与数字相除时出现“Float对象不可调用”

0 投票
3 回答
779 浏览
提问于 2025-04-17 11:03

我有一个叫做 Portfolio 的类,里面有一个方法 portfolio_risk(self, year)。如果我尝试用一个数字去除这个方法,就会出现一个错误:

浮点对象不可调用

根据我的理解,这个错误是因为 portfolio_risk 方法后面有括号,但我需要调用这个方法来进行计算。有没有其他方法可以写这段代码,以避免这个错误呢?

if Portfolio.portfolio_risk(1)/5 < 7:
    print('meets criteria')

补充说明:我在下面添加了一些更多的信息:

我的类是这样的:

class Portfolio(import_data):

    def __init__(self, number_yrs):

        self.debt = [0 for i in range(number_yrs)]

        # the import_csv function just pulls a data table from excel and creates a list
        # the list is 2D and creates a property called self.sub_portfolio in this class
        # all the values imported from the csv file are of type float 
        self.import_csv('sub_portfolio') 
        self.debt[0] = self.debt_portfolio

    def portfolio_risk(self, year):

        # this sums up the risk column of a portfolio to give total risk for a year

        self.portfolio_risk = sum(a[0] for a in self.debt[year])
        return(self.portfolio_risk)

如果我创建这个类的一个实例:

new_portfolio = Portfolio(5)

我的 Portfolio 类在一个文件 portfolio_class.py 中,当我在这个文件里测试时,以下代码可以正常工作:

print(new_portfolio.portfolio_risk(0))

在另一个文件 analysis.py 中,我有以下代码:

 nyears = 10
 real_portfolio = Portfolio(nyears)
 for i in range(nyears):

    if i > 0:

        # first use last prior year portfolio
        the_debt_portfolio.debt[i] = the_debt_portfolio.debt[i-1]


    if real_portfolio.portfolio_risk(i)/ 5 < 7:

        print('this is within the risk band')

现在我似乎遇到了这个错误:

  line 29, in portfolio_risk
  self.portfolio_risk = sum(a[0] for a in self.portfolio_risk[year])
  TypeError: 'int' object is not iterable

而不是浮点对象不可调用的错误

3 个回答

0

你可以试试这样做:

portfolio = Portfolio() # you may need to pass some parameters

if portfolio.portfolio_risk(1) / 5 < 7:
    print('meets criteria')

当然,如果 portfolio_risk 是一个字段而不是一个方法,你还是会遇到那个错误。

3

如果这个方法是这样定义的:

class Portfolio(object):
    def portfolio_risk(self, year):
        return 1

那么你必须有一个Portfolio的实例:

p = Portfolio()
if p.portfolio_risk(1) / 5 < 7:
    # do something
3

你的代码有几个问题:

  1. If 应该改成 if(小写的 i);
  2. 你需要一个 Portfolio 的实例,才能调用那个(非静态的)方法。

不过,关于你遇到的那个具体错误,情况不是很清楚。一个可能的原因是你在某个地方把 portfolio_risk 重新绑定成了一个 float 类型。即便如此,首字母大写的 If 也会导致语法错误。

我觉得最好的办法是先解决上面提到的两个问题,如果这样还不行,再发更多的代码出来。

撰写回答