ฉันใช้ไพธอน 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_
รู้ไหมว่าทำไม? ฉันไม่สามารถหาทางออก
classname
จะทำลายสำหรับ subclasses เพราะ setter นถูกเขียนในฐานเรียนดังนั้นชื่อแอททริบิวต์ยังคงอยู่ยี้_A__a
.