Majetku setter nefunguje, keď atribút začína "__"?

0

Otázka

Ja používam Python 3.8.6 a to funguje

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 nefunguje

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 myseľ vyfúknutie! jediný rozdiel medzi prvým a druhým príkladom je, že súkromný atribút je __a namiesto _a_

Nejaký nápad, prečo? Nevedela som na to prísť

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

Najlepšiu odpoveď

1

Je to v dôsledku súkromného názov mangling, ale to sa netýka obsahu reťazcov, ako ten, ktorý ste absolvovanie getattr().

Našťastie problém 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 si, že pomocou variant classname bude prestávka na podtriedy, pretože setter je napísané v základnej triede takže názov atribútu bude stále rozbité na _A__a.
kaya3

@kaya3: "zlomiť" to, čo zmysel? Používa názov podtrieda v jednom.
martineau

Dobre, ak class B(A): pass potom b = B(); b._a = 23; print(b._a) vytlačiť 0 pretože setra píše _A__a ale getter snaží prístup _B__a.
kaya3

@kaya3: Máte pravdu, takže som odstránil, že časť mojej odpovede.
martineau

V iných jazykoch

Táto stránka je v iných jazykoch

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