gpt4 book ai didi

python - 如何使用元类创建一个类属性,该元类仅在类本身未定义时才覆盖?

转载 作者:行者123 更新时间:2023-12-01 05:20:41 26 4
gpt4 key购买 nike

我有这样的设置:

class Meta(type):
@property
def test(self):
return "Meta"


class Test(object):
__metaclass__ = Meta
test = "Test"


class TestSub(object):
test = "TestSub"

print(Test.test, TestSub.test)

这会产生以下输出:

('Meta', 'TestSub')

我期望的是:

('Test', 'TestSub')

我知道为什么会发生这种情况:test 是在执行元类 Meta 之前在 Test 上分配的。但我不知道如何实现一种干净的方式来改变这种行为。我知道我可以在 Meta 类的 __init____new__ 中进行修改,但这看起来很脏,因为我必须为每个修改它新属性(property)。那么有没有一种干净的方法(比如编写一个新的装饰器)来实现这一点?

我也不喜欢仅仅为了解决这个问题而创建一个中间类的想法,但会接受它作为最后的手段。

最佳答案

事实上,您的 Test 类的 test 属性不会被覆盖。它仍然在那里:

>>> Test.__dict__['test']
'Test'

但是,执行 Test.test 不会访问它,因为根据 the documentation :

If an instance’s dictionary has an entry with the same name as a data descriptor, the data descriptor takes precedence.

property 创建一个数据描述符。因此,通过使用元类中的属性,您可以阻止对类上普通类变量的访问。

如何最好地解决这个问题尚不清楚,因为尚不清楚您要通过此结构实现什么目标。鉴于您发布的代码,根本不清楚您为什么使用元类。如果您只想覆盖子类上的类属性,您可以通过简单继承来实现,如 unutbu 的答案中所述。

关于python - 如何使用元类创建一个类属性,该元类仅在类本身未定义时才覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22462796/

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