我可以在Python中动态实现类方法吗



在Python中,可以动态实现类实例的属性,这已经不是什么秘密了。以下是它的样子:

class MyClass(object):
def __getattribute__(self, name):
if name == 'dynamic_attribute':
return "dynamic attribute value"
return super().__getattribute__(name)
# Create an instance of my class
obj = MyClass()
# I've implemented the 'dynamic_attribute' attribute dynamically, so I can
# reference it without ever having assigned it a value
print(obj.dynamic_attribute)
# As I've only implemented that one attribute dynamically, other attributes
# behave in the standard way
try:
print(obj.regular_attribute)
except AttributeError as ex:
print(f"EXPECTED ERROR: {ex}")
obj.regular_attribute = "regular attribute value"
print(obj.regular_attribute)

结果:

dynamic attribute value
EXPECTED ERROR: 'MyClass' object has no attribute 'regular_attribute'
regular attribute value

有没有办法用类属性而不是类实例属性来做同样的事情?这里有一个例子:

print(MyClass.dynamic_class_attribute)

我希望这行代码返回一个在代码中某处计算的值,而不必在MyClass类上显式定义"dynamic_class_attribute"属性。这能做到吗?TIA。

附言:我从来没有对元类做过任何事情,但我知道它们的存在。我读了一些关于他们的文章,希望这个问题能有一个明显的答案。我没有找到。

更新:

有人问我为什么要这个。也许其他人会觉得我的用例很有趣。我基本上只是对简化我正在创建的API有点挑剔。它并没有这么简单,但它基本上是一个单例的东西,我真正做的只是试图取代它:

SomeSingletonClass.get().some_method()

这个:

SomeSingletonClass.some_method()

在任何时候,都有一个SomeSingletonClass实例,我经常引用这个实例,所以我想尽可能简化对它的全局引用。有了Raymond H的回答,我做到了。效果很好。

有没有办法用类属性而不是类实例属性来做同样的事情?

是的,只需将逻辑移动到元类中即可:

class MyMetaClass(type):
def __getattribute__(self, name):
if name == 'dynamic_attribute':
return "dynamic attribute value"
return super().__getattribute__(name)
class C(metaclass=MyMetaClass):
pass
print(C.dynamic_attribute)

基本思想是正则类控制实例的行为,元类控制类的行为。

最新更新