Python: zajistit, třídy, atributy nejsou sdíleny mezi společné dědictví stromy

0

Otázka

Mám pocit, že už jsem to někde viděl, ale nejsem si jistý, zda to je re-konstruována paměti, nebo pokud je to opravdu existuje. V žádném případě nemohu najít odkaz na tuto situaci:

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

Ve výše uvedeném příkladu, A.a is B.a is C.a. Ale, vlastně jsem chtěl, je být samostatný při zachování této struktury. Tam je dobrý důvod pro to a nechci diskutovat o proměnné instance. Důvodem pro to je, že v mé aplikaci všechny tyto třídy jsou používány jako 'jmenné prostory'. K vyřešení "problému", nahradím A zdědil díly kopii sebe sama jako (pseudo kód):

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

Nejlepší odpověď

1

Definovat __init_subclass__ automaticky zkopírovat nadřazené třídy-atributy, když childclass je definován.

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)))

To bude kopírovat vše, co z nadřazené třídy oboru názvů, který nelze spustit s _. V praxi, jeden by mohl chtít uplatnit přísnější pravidla.

Na __init_subclass__ je možné automaticky spustit, když podtřídy je definován. To znamená, podtřídy získat kopírovat atributy, aniž by museli spustit kód explicitně.

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

Přijímám tuto odpověď, protože to je vlastně dobrý nápad. Z důvodu způsob, jak můj balíček je postaven (zejména její velikosti), to by vlastně stát téměř nečitelný použití této implementace a nechám copy_func verze... ale to je ještě dobrá odpověď.
deponovo

V jiných jazycích

Tato stránka je v jiných jazycích

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