ทรัพย์สิน setter ไม่ได้ทำงานตอนที่แอททริบิวต์เริ่มด้วย"__"?

0

คำถาม

ฉันใช้ไพธอน 3.8.6 และมันทำงานสบายดี

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

นี่มันไม่ทำงาน

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

นั่นคือจิตใจระเบิด! ความแตกต่างเพียงอย่างเดียวระหว่างแรกและครั้งที่สองตัวอย่างเช่นนั่นคือส่วนตัวลักษณะเฉพาะคือ __a แทนที่จะเป็น _a_

รู้ไหมว่าทำไม? ฉันไม่สามารถหาทางออก

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

คำตอบที่ดีที่สุด

1

มันเป็นเนื่องจาก ส่วนตัวชื่อของ manglingแต่มันไม่มีผลต่อเนื้อหาของข้อความ literals เหมือนคนที่คุณกำลังส่งไป getattr().

โชคดีที่คนซ่อมเป็นธรรมดา:

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

ฉันคิดว่าผังย่อยโดยใช้ classname จะทำลายสำหรับ subclasses เพราะ setter นถูกเขียนในฐานเรียนดังนั้นชื่อแอททริบิวต์ยังคงอยู่ยี้ _A__a.
kaya3

@kaya3:"พัก"มันอะไรเลย มันใช้ชื่อของคลาสย่อยในหนึ่ง
martineau

ถ้า class B(A): pass แล้ว b = B(); b._a = 23; print(b._a) จะพิมพ์ 0 เพราะ setter เขี _A__a แต่ getter พยายามจะใช้งาน _B__a.
kaya3

@kaya3:คุณพูดถูกดังนั้นฉันถูกลบออส่วนนั้นขอคำตอบของฉัน
martineau

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่