gpt4 book ai didi

python - 在 Python 中,如何将属性同时用作属性和方法/可调用对象?

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:32 25 4
gpt4 key购买 nike

这是一种实验。我对支持这两种语法的 API 很感兴趣:

obj.thing

-->返回默认值

obj.thing(2, 'a')

--> 返回从 *args 和 **kwargs 派生的值

thing”在两种情况下都是同一个对象;我希望 thing 的调用是可选的(或者隐式的,如果它后面没有 () 的话)。

我尝试覆盖 __repr__,但这只是对象本身的可视化表示,实际返回的是包含对象(此处为“obj”)的实例。所以,不好。

我在想,在一个具有足够默认值的可调用对象上设置一个属性(不管它是实例、def 还是只是对象上的 __call__):

class CallableDefault(object):
__call__(self, num=3, letter="z"):
return letter * num

class DumbObject(object):
foo = CallableDefault()

obj = DumbObject()

因此,理想情况下,单独执行 obj 会返回“zzz”,但也可以执行 obj(7,'a') 并得到 'aaaaaaa'。

我认为装饰器可能是实现此目的的方法,但我不太擅长装饰器。可以覆盖对包含类的 getattr() 调用,但这意味着它必须位于支持此功能的包含类中。

最佳答案

您描述的可能有效,但请注意,现在属性的值被限制为您的 CallableDefault 类的对象。这可能不会很有用。

我强烈建议您不要尝试这样做。一方面,您花费了大量时间试图诱使 Python 做它不想做的事情。另一方面,您的 API 的用户会感到困惑,因为它的行为不同于他们见过的所有其他 Python 代码。他们会感到困惑。

编写可在 Python 中自然运行的 Python API。

关于python - 在 Python 中,如何将属性同时用作属性和方法/可调用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7692983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com