【问题标题】:Python class return typesPython 类返回类型
【发布时间】:2020-02-29 08:39:28
【问题描述】:

我想知道是否有人可以帮助我。 如果我有一个具有属性的类,是否有办法自动使该类的对象在调用时返回该属性

class Constant():
def __init__(self, value):
    self.__value = value
PI = Constant(3.14)

有没有办法让它返回 3.14(作为实际的浮点数而不是字符串)而不显式定义 __float__ 方法并调用 float(PI)。我希望能够按照print(PI*2) 的方式说一些话,并将6.28 作为我的输出

编辑: 我找到了我想要的,通过使用__new__ 方法,我可以将实例的返回值更改为我想要的任何值。

第二次编辑: 事实证明这不起作用。

【问题讨论】:

  • self.__value = float(value) 有效吗?
  • @Tserenjamts __value 是正确的“值”(想不出另一个词),问题是在几乎像宏一样调用 PI 的地方返回它,我希望 PI 像浮点变量除了内部控制更多
  • 如果您想在尝试对实例执行任何操作时自动将其实例替换为其他对象,为什么还要拥有这个类?
  • @OwenMehta-Jones:但是...如果您有您要求的这种自动替换功能,您将不会能够执行任何强制执行,而且您将无法提供额外的方法。即使你在你的类上定义了一些foo 方法,你也不能做PI.foo(),因为PI 会被3.14 替换,而3.14 没有foo 方法。
  • 首先,这与 Python 的执行模型根本不兼容。其次,你会发现你想“只返回 3.14”的情况并不像你想象的那么明确。例如,您将无法将类的实例传递给其他函数,因为foo(PI) 是“没有附加任何方法调用的 PI”。你也很难访问像is_integer 这样的float 方法,因为PI.is_integer() 有一个“附加的方法调用”。

标签: python class methods types


【解决方案1】:

尝试子类化float

class Constant(float):
    def __init__(self, value):
        self.__value = value
PI = Constant(3.14)
print(PI*2)

输出:

6.28

【讨论】:

  • 这只适用于乘法。我认为@Owen Mehta-Jones 正在寻找可以让他们将 PI 视为数字的东西。
  • @LocalhostNotfound Now?
  • 这好多了,但我希望能够使用多种数据类型,除非我只是为每种类型创建子类...?
  • @OwenMehta-Jones 还有哪些类型?
  • @U10-Forward 基本上是任何内置类型。
【解决方案2】:

试试这个访问私有变量

class Constant():
    def __init__(self, value):
        self.__value = value

PI = Constant(3.14)
print(PI._Constant__value*2)

6.28

【讨论】:

  • 不是我想要的。如果我真的想要,我会创建一个@property 方法并让用户每次都输入 PI.val,但我想要一个常量类,您可以在其中调用对象并获取返回值。
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 2021-03-11
  • 2012-06-09
  • 2016-08-16
  • 2013-02-26
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多