Python ООП вопрос про теорию

Для роста своего скила и улучшения понимания, задался вопросом про понимание наследования в Python./ У меня есть два класса родитель и наследник, имеющие приватный атрибут __n.

class A:
    __n = "a"

    def __init__(self) -> None:
        print(self.__n)


class B(A):
    __n = "b"


A()
B()

# a
# a

При наследовании из-за искажения имен доступ к новому значению __n утерян.

Я решаю эту проблему таким способом:

class A:
    __n = "a"

    def __init__(self) -> None:
        print(self.__true_n)

    @classmethod
    @property
    def __true_n(cls):
        return getattr(cls, f"_{cls.__name__}__n")


class B(A):
    __n = "b"


A()
B()

# a
# b

Хочу разобраться, существует ли более "правильный" или "Питоновский" способ получение доступа к атрибуту __n?


Ответы (1 шт):

Автор решения: Amgarak

Я бы сделал как-то так:

class A:
    __n= "Приват A"

    @property
    def n(self):
        return self.__n

class B(A):
    __n = "Приват B"
    
    @property
    def nA(self):
        return super().n
        
    @property
    def n(self):
        return self.__n

obj_a = A()
obj_b = B()

print(obj_a.n)  
print(obj_b.nA)  
print(obj_b.n)  

Вывод:

Приват A
Приват A
Приват B

[Program finished]
→ Ссылка