【问题标题】:Can't print an attribute of my own class in python无法在python中打印我自己的类的属性
【发布时间】:2014-05-07 05:55:04
【问题描述】:

我得到错误:

TypeError: 'int' object is not callable

当我尝试做这样的事情时:

first = Rational()
print(first.numerator())

下面是我的代码:

class Rational:

def __init__(self, numerator=0, denominator=1):
    self.numerator = numerator
    self.denominator = denominator

def numerator(self):
    return self.numerator

def denominator(self):
    return self.denominator

def __str__(self):     
    return str(self.numerator) + "/" + str(self.denominator)

python 似乎认为分子是 int 类型,但我认为我将它作为 Rational 类的属性。我非常困惑。

感谢您的澄清!

【问题讨论】:

  • 您不会像在此处粘贴代码那样缩进它吗?我现在不在可以运行 Python 的机器上。

标签: python object int typeerror callable


【解决方案1】:

您正在寻找:

class Rational:

    def __init__(self, numerator=0, denominator=1):
        self._numerator = numerator
        self.denominator = denominator

    @property
    def numerator(self):
        return self._numerator

那么您的调用代码将如下所示:

first = Rational()
print(first.numerator)

您的代码中发生的情况是 Rational.numerator 按照正常方式绑定到您在模块导入时定义的方法。但是,您的 __init__ 方法明确表示“创建一个名为 denominator 的实例属性绑定到此 int 对象”。该新实例属性在同名的类属性之前解析,因此对instance.denominator 的任何引用都将解析为该实例属性。

如果你真的想实现一个 getter(它不是特别 Pythonic;你已经有办法访问 instance.denominator 内置的!),我建议的替代方法是将它存储在一个私有命名的变量中,然后创建一个公开命名的属性方法,加载它的值并返回它。

【讨论】:

  • 这似乎不起作用。仍然得到同样的错误。本质上,属性之前的“_”使其仅在类内私有?
  • 好吧,你必须决定你想要 .numerator 的调用语义。它应该像一个 int 一样工作并返回一个 int 值,还是应该像一个函数一样被调用?如果你真的想要函数语义,删除@property 装饰器并像instance.numerator() 一样访问它。不过,我个人建议直接访问 .numerator.denominator 属性,而无需通过 getter 方法。
【解决方案2】:

您的代码中有太多 numerators... ;-) 您在__init__ 方法的第一行有一个名为numerator 的属性,另一个是def numerator(self) 定义的方法。 根据您的需要有不同的可能性:

  1. 删除方法并始终使用first.numerator
  2. 重命名属性,使它们没有冲突。
  3. 使用@property 子句,但我不认为在这种情况下您为什么要这样做,因为没有什么可以计算或修改属性,

【讨论】:

  • 完美!如果您认为它已解决,请不要忘记将我的答案标记为已选择。 ;-) 提前致谢!
猜你喜欢
  • 2018-09-17
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
相关资源
最近更新 更多