gpt4 book ai didi

python - 模块可以像对象一样具有属性吗?

转载 作者:IT老高 更新时间:2023-10-28 21:11:54 24 4
gpt4 key购买 nike

使用 python 属性,我可以做到这一点

obj.y 

调用一个函数而不是仅仅返回一个值。

有没有办法用模块做到这一点?我有一个我想要的案例

module.y 

调用一个函数,而不是仅仅返回存储在那里的值。

最佳答案

作为 PEP 562已经在 Python >= 3.7 中实现,现在我们可以这样做了

文件:module.py

def __getattr__(name):
if name == 'y':
return 3
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")

other = 4

演示:

>>> import module
>>> module.y
3
>>> module.other
4
>>> module.nosuch
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "module.py", line 4, in __getattr__
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
AttributeError: module 'module' has no attribute 'nosuch'

请注意,如果您省略 raise AttributeError__getattr__函数,表示函数以return None结尾,然后是 module.nosuch将获得 None 的值.

编辑

我的答案不能有 setter 和删除器。如果需要,请采纳 kxr 的答案。

创建 <class 'module'> 的子类,在该类中定义属性,然后将模块类更改为该类。

文件:mymodule.py

import sys

class This(sys.__class__): # sys.__class__ is <class 'module'>
_y = 3

@property
def y(self): # do the property things in this class
return self._y

@y.setter
def y(self, value): # setter is also OK
self._y = value

other = 4

sys.modules[__name__].__class__ = This # change module class into This

演示:

>>> import mymodule
>>> mymodule.y
3
>>> mymodule.other
4
>>> mymodule.y = 5
>>> mymodule.y
5
>>> mymodule._y
5 # to prove that setter works

我太新手了,不知道它为什么会起作用。所以功劳应该归于 kxr。

关于python - 模块可以像对象一样具有属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/880530/

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