【问题标题】:In Python, is there a way to return a specific attribute value by accessing the class object directly, without specifying object.attribute?在Python中,有没有办法通过直接访问类对象而不指定object.attribute来返回特定的属性值?
【发布时间】:2021-06-26 01:19:42
【问题描述】:

假设我有一堂课:

class Test:

 def __init__(self):
    self.value = 1;

test = Test();

是否可以在访问对象本身时指定默认访问value的方式?例如:

a = 1 + test   # by default this would be equivalent to a = 1 + test.value

这个问题的原因是我有一些带有内置验证的标准对象,我几乎总是只能从中获得value 属性。目的只是为了减少混乱。

一位用户建议覆盖特定的必要操作,但在我发表评论之前,答案已被删除。这也许可行,但我想知道在一般层面上是否可行。

【问题讨论】:

  • 尝试提供这样的语言功能的问题是,当您想要自动转换时,如何防止自动转换?因为自动转换导致的问题比您似乎意识到的要多得多,并且尝试从上下文线索推断您是否想要转换非常容易出错。
  • 如果您几乎总是只需要 value 属性,那么编写一个完全不向调用者公开 Test 实例并且只返回value。调用者可以直接为他们需要其他功能的极少数情况创建一个Test 实例。 (完全消除Test 甚至让Test 委托给函数可能更有意义,而不是相反。)
  • 为了提供更多细节,我将这些作为设置类型来实现。考虑一个存储参数值、最小值和最大值、默认值和参数名称的类 IntParameter。使用属性装饰器,我会通过 setter 自动检查值是否有效。在系统使用过程中,设置好值后,我实际上只调用了obj.value。在执行结束时,我可能必须检查该值是否与默认值不同。也许按照我的要求做是不可取的,但我仍然很好奇。感谢@user2357112supportsMonica 的讨论!
  • @Chicoscience 继承int 然后覆盖__new____init__ 方法可能是一个解决方案。这样,您还可以在使用实例时添加自己的方法或属性,就像使用整数一样。我想到的唯一问题是整数在 Python 中是不可变的。

标签: python python-3.x class attributes


【解决方案1】:

我认为这不是合适的方式,因为默认情况下,如果 Python 类被初始化,它将返回 None。但如果你还想做。您可以使用__new__ 代替__init__

class Test:
    def __new__(cls):
        cls.value = 1
        return cls.value

test = Test()
print(test)

输出:

1

【讨论】:

  • 这实际上并没有创建Test 的实例。它只是设置一个类属性并返回1。您不能在(不存在的)实例上调用任何方法,也不能为不只需要 value 属性的罕见但存在的情况执行任何您需要做的事情。
  • 同意。这就是为什么我之前提到不建议这样做的原因。
猜你喜欢
  • 2013-06-05
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
  • 2022-08-23
  • 2015-10-21
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多