Переменные класса не могут выполнить поиск атрибута в переменной экземпляра - PullRequest
0 голосов
/ 26 октября 2018

Во время игры и изучения обширной темы ООП Python я заметил, что переменная класса может быть доступна для созданного экземпляра класса, но класс не может вызвать переменную экземпляра, определенную с помощью класса

class abc():
    height=180
    def __init__(self,name):
        self.age=12 
        self.name=name


ee=abc("Muhammad")
print(ee.height)
print(abc.height)

output

180
180

Но если я пытаюсь получить доступ к переменной класса напрямую через имя класса, возникает ошибка.

ee=abc("Muhammad")
print(ee.height)
print(abc.age)

output

AttributeError: class abc has no attribute 'age'

Итак, я заметил это и подумал, что было бы полезно поделиться с новичками глубиной ООП Python.Пожалуйста, если кто-то может пролить свет на это.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Каждый раз, когда вы определяете переменную в классе, вы либо определяете переменную в области действия class или в области действия instance . Строка height = 180 определяет высоту в области видимости класса (область видимости класса является в основном глобальной областью видимости для класса). Строки self.age = 12 и self.name = name определяют age и name в области действия экземпляра (область действия экземпляра в основном является локальной областью действия).

В python, если вы выполняете поиск атрибутов с экземпляром (например, ee.height), экземпляр сначала ищет переменную height в области действия экземпляра, если он там не найден, то экземпляр поиск в области видимости. Однако, если вы выполняете поиск атрибутов с помощью класса (например, abc.age), класс не может получить доступ к локальной области экземпляра и, следовательно, может искать переменную age только в области действия класса. Поскольку в области видимости переменной нет, он возвращает Ошибка атрибута .

0 голосов
/ 26 октября 2018

Вы не устанавливаете атрибут с age = 12 в __init__. Все, что вы делаете, - это определяете локальную переменную, которая будет собирать мусор после выполнения __init__.

Вы должны использовать abc.age = 12, чтобы фактически установить атрибут для класса abc
(или type(self).age = 12).

Я предполагаю, что это учебный пример, иначе определение возраста в классе для людей, которые, кажется, моделируют людей, не очень полезно.

Повторная установка атрибута класса при каждом вызове __init__ также является избыточной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...