Атрибуты класса Python и их инициализация

Я довольно новичок в python, и в эти дни я изучаю классы. У меня есть вопрос об атрибутах и ​​переменных внутри классов: в чем разница между определением атрибута через q=1 в теле класса и с помощью определения self.q=1 внутри __init__ ? Например, в чем разница между двумя следующими возможностями?

 class MyClass1: q=1 def __init__(self,p): self.p=p def AddSomething(self,x): self.q = self.q+x 

а также

 class MyClass2: def __init__(self,p): self.q=1 self.p=p def AddSomething(self,x): self.q = self.q+x 

Вывод, например:

 >>> my=MyClass1(2) >>> my.p 2 >>> my.q 1 >>> my.AddSomething(7) >>> my.q 8 

не зависит от того, MyClass1 ли MyClass1 или MyClass2 . Ни в MyClass1 ни в MyClass2 не возникает ошибка.

  • NameError с использованием execfile в python
  • Попытка создать объект через вход пользователя
  • Как читать атрибуты класса в том же порядке, что и объявлено?
  • class ClassName и класс ClassName (объект)
  • Создание объекта Python
  • Получить объект с максимальным значением атрибута в списке объектов
  • Метод вызова Python в классе
  • Декораторы Python в классах
  • 3 Solutions collect form web for “Атрибуты класса Python и их инициализация”

    Классы, а также их экземпляры в python используют словарическую структуру данных для хранения информации.

    Таким образом, для каждого определения класса будет выделен словарь, в котором будет храниться информация о классе (переменные класса). И для каждого экземпляра этого конкретного класса будет выделен отдельный словарь (self), где будет храниться конкретная информация экземпляра (переменные экземпляра).

    Итак, следующий вопрос: как будет выполняться поиск определенного имени?

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

    Обратите внимание, что когда вы пишете d ['key'] = val, где d – словарь, «ключ» автоматически добавляется в словарь, если он еще не присутствует. В противном случае текущее значение будет перезаписано. Имейте это в виду, прежде чем читать дальнейшие объяснения.

    Теперь давайте рассмотрим код, который вы использовали для описания своей проблемы:

    MyClass1

     class MyClass1: q=1 def __init__(self,p): self.p=p def AddSomething(self,x): self.q = self.q+x 

     1. my = Myclass1(2) #create new instance and add variables to it. MyClass = {"q" : 1} my = {"p" : 2} 

     2. my.p # =2, p will be taken from Dictionary of my-instance. 

     3. my.q # =1, q will be takn from MyClass dict. (Not present in dictionary of my-instance). 

     4. my.AddSomething(7) # This method access the value of q (using self.q) first # which is not defined in my dict and hence will be taken # from dictionary of MyClass. After the addition operation, # the sum is being stored in self.q. Note that now we are # adding the name q to Dictionary of my-instance and hence # a new memory space will be created in Dictionary of my-instance # and the future references to self.q will fetch the value # of self.q from dictionary of my-instance. MyClass = {"q" : 1} my = {"p" : 2, "q" : 8} 

     5. my.q # =8, q now is available in dictionary of my-instance. 

    Самое существенное различие между атрибутом q в этих классах заключается в том, что в реализации MyClass1 переменная будет разделяться во всех экземплярах этого класса, в то время как в MyClass2 она видна только в области этого конкретного объекта.

    Некоторые документы: https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

    q=1 внутри класса – это атрибут класса, связанный с классом в целом, а не с каким-либо конкретным экземпляром класса. Он наиболее четко доступен с помощью самого класса: MyClass1.q .

    Атрибут экземпляра присваивается непосредственно экземпляру класса, обычно в __init__ , присваивая self (например, self.p = p ), но вы можете в любой момент назначить атрибуты экземпляру.

    Атрибуты класса могут быть прочитаны либо с использованием привязки класса ( MyClass.q ), либо привязки экземпляра ( my.q , если он не затенен атрибутом экземпляра с тем же именем). Однако они могут быть установлены только с использованием привязки класса. Установка значения с привязкой экземпляра всегда изменяет атрибут экземпляра, создавая его, если необходимо. Рассмотрим этот пример:

     >>> a = MyClass1() >>> aq 1 >>> aq = 3 # Create an instance attribute that shadows the class attribute 3 >>> MyClass1.q 1 >>> b = MyClass1() >>> bq # b doesn't have an instance attribute q, so access the class's 1 
    Interesting Posts
    Python - лучший язык программирования в мире.