Vlastnost setter nefunguje, když atributu začíná "__"?

0

Otázka

Já používám Python 3.8.6 a to funguje v pohodě

class A:
    @property
    def _a(self):
        return getattr(self, '_a_', 0)

    @_a.setter
    def _a(self, value):
        self._a_ = value


a = A()
print(a._a)  # prints 0
a._a = 10
print(a._a)  # prints 10 as expected

To nebude fungovat

class A:
    @property
    def _a(self):
        return getattr(self, '__a', 0)

    @_a.setter
    def _a(self, value):
        self.__a = value

a = A()
print(a._a)  # prints 0
a._a = 10
print(a._a)  # prints 0 again

To je mysl vyfukování! jediný rozdíl mezi prvním a druhým příkladem je, že soukromý atribut je __a místo _a_

Nějaký nápad, proč? Nebyl jsem schopen na to přijít

properties python
2021-11-20 09:49:15
1

Nejlepší odpověď

1

To je vzhledem k vlastní jméno mandlování, ale to se nevztahuje na obsah řetězcové literály jako jsi kolem getattr().

Naštěstí oprava je jednoduchá:

class A:
    @property
    def _a(self):
        return getattr(self, '_A__a', 0)

    @_a.setter
    def _a(self, value):
        self.__a = value

a = A()
print(a._a)  # prints 0
a._a = 10
print(a._a)  # prints 10 now
2021-11-20 15:39:03

Myslím, že varianta použití classname bude přestávka na podtřídy, protože setr je napsáno v základní třídě tak název atributu bude stále rozbité do _A__a.
kaya3

@kaya3: "rozbít" to, co smysl? To používá název podtřídy v jednom.
martineau

No, pokud class B(A): pass pak b = B(); b._a = 23; print(b._a) bude tisknout 0 protože setr píše _A__a ale getter pokusí o přístup _B__a.
kaya3

@kaya3: máš pravdu, tak jsem odstranil tu část mé odpovědi.
martineau

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ý
..................................................................................................................