Python Наследование: ошибка атрибута при использовании родительского метода для вывода унаследованной переменной - PullRequest
1 голос
/ 27 мая 2020
  1. Я новичок в python наследовании, и я столкнулся с простой проблемой, просто чтобы распечатать переменные.
  2. У меня печатает родительский класс
class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self.__name = "A"

a = A()
n = a.getName()

print(n)

Я получил ошибку

 AttributeError: 'A' object has no attribute '_prints__name'
  • Я знаю, что могу сделать это на C ++, но я чешу затылок, пытаясь понять, где не так в моем python коде ..

Может кто поможет? Спасибо!

Ответы [ 3 ]

3 голосов
/ 27 мая 2020

Python не реализует закрытые переменные, но помогает снизить риск конфликтов имен с переменными, которые вы хотите сохранить закрытыми для класса. Если ваша переменная экземпляра начинается с двух знаков подчеркивания, python добавит имя класса. См. «Изменение имени» в Private Variables Итак, переменная prints __name переименована в _prints__name.

Этот метод работает, за исключением случаев, когда это не так. У унаследованных классов нет естественного способа доступа к переменной. Обычно это не проблема, потому что это все-таки частный класс. Один из способов его использования - вызвать методы базового класса. В этом случае вам, вероятно, следовало вызвать базовый класс __init__ для установки переменной. Но если вы хотите использовать его напрямую, вы можете сделать self._prints__name.

class prints:
   def __init__(self):
       self.__name = ""
   def getName(self):
       return self.__name

class A(prints):
   def __init__(self):
       self._prints__name = "A"

a = A()
n = a.getName()

print(n)
2 голосов
/ 27 мая 2020

Проблема в том, что вы используете переменную с префиксом __. Официально python не имеет частных переменных, но когда вы используете var с префиксом __, он сохраняется как _className__var,

Если вы заглянете внутрь a.__dict__:

a.__dict__
Out[9]: {'_A__name': 'A'}

Итак, когда вы выполняете a.getName(), наследование logi c, которое, как вы ожидаете, приведет к тому, что родитель ищет getName, глядя на prints.__dict__ (который находит совпадение)

Это будет попытаться разрешить __name родителя, за исключением того, что в этом случае он будет искать его как _prints__name из self, который является экземпляром A.

Это называется искажением имени

0 голосов
/ 27 мая 2020
class prints:
   def __init__(self, name):
       self.name = ""

   def getName(self):
       return self.name

class A(prints):
   def __init__(self):
       self.name = "A"

 a = A()
 n = a.getName()

print(n)

см. Основы в python https://www.w3schools.com/python/python_inheritance.asp

...