蟒蛇:确保类属性之间不共享共同的继承的树木

0

的问题

我有种感觉我已经看到了这个地方,但我不再确定是否这是一个重新构成的存储器,或者如果它确实存在。 在任何情况下,我找不到一个参考这种情况:

class A:
    a = 1

class B(A):  # should have it's own class attribute 'a'
    pass

class C(A):  # should have it's own class attribute 'a' and newly defined 'c'
    c = 3

在上述例子中, A.a is B.a is C.a. 但是,其实我希望他们能独立,同时保持这种结构。 这是一个很好的理由为这个我不想要讨论的实例的变量。 其中的原因是,在我用所有这些课程被用作'的名字空间'. 要解决的'问题',我代替 A 继承部分通过复制本身,因为(pseudo code):

class A:
    a = 1

class B(A):  # B.a resolves to A.a
    pass

class C(A):  # C.a resolves to A.a
    c = 3

copy_func(B.A, A)  # investigates public attrs of A and B and create copies, now B.a is not A.a
copy_func(C.A, A)  # investigates public attrs of A and B and create copies, now C.a is not A.a
inheritance python
2021-11-23 13:33:06
1

最好的答案

1

定义 __init_subclass__ 自动复制超类属性时childclass定义。

import copy

class A:
    a = []

    def __init_subclass__(cls, **kwargs):
        for base in cls.mro():
            for attr in base.__dict__:
                if attr not in cls.__dict__ and not attr.startswith("_"):
                    setattr(cls, attr, copy.copy(getattr(cls, attr)))

这将复制一切从超类的名字空间,不能开始 _. 在实践中,人们可能希望申请更具限制性的规则。

__init_subclass__ 是时自动运行的一个亚类的定义。 这意味着亚类获得复制的属性而不必跑码明确。

class B(A):
    pass

class C(A):
    c = 3

assert B.a is not A.a
assert C.a is not A.a
2021-11-23 13:48:56

我接受这个答案,因为它实际上是一个很好的建议。 由于我的包装内(特别是其大小),它实际上成为几乎不可读的,使用这种执行情况和我会继续的 copy_func 版本...但是它仍然是一个很好的答案。
deponovo

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................