Witajcie.
Załóżmy, że mam prostą klasę, w której mam potrzebę kontroli tego, co jest w jej instancji przypisywane, tak więc tworzę kod z definicją slots:
class Test:
__slots__ = ['_out']
def __init__(self):
self._out = None
pass
@property
def out(self):
return self._out
@out.setter
def out(self, value):
self._out = value
if __name__ == "__main__":
o = Test()
o.out = "test"
o._x = 'a'
print("{}".format(o))
print("OUT: {}".format(o.out))
Rzuca to wyjątek zgodnie z moimi oczekiwaniami:
% python3 test.py
Traceback (most recent call last):
File "test.py", line 32, in <module>
o._x = 'a'
AttributeError: 'Test' object has no attribute '_x'
Załóżmy jednak potrzebę utworzenia interfejsu, z której powyższa klasa będzie dziedziczyła:
from abc import ABC, abstractmethod
class ITest(ABC):
@property
@abstractmethod
def out(self):
pass
@out.setter
@abstractmethod
def out(self):
pass
class Test(ITest):
__slots__ = ['_out']
[dalej bez zmian]
w powyższej sytuacji deklaracja slots nie ogranicza już możliwości tworzenia atrybutów:
% python3 test.py
<__main__.Test object at 0x7f5347a40248>
OUT: test
I tutaj moje pytanie: jak to poprawnie napisać przy powyższych założeniach?