【发布时间】: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