Это вопрос, который сбивает с толку каждого изучающего Python среднего уровня, поэтому, пожалуйста, дайте краткий (и понятный для идиотов) ответ.

Я хотел создать переменную, которая увеличивает переменную population на 1 при создании нового объекта.

class Human:

    population = 0

    # initialization.
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    
    def increment_pop(self):
        self.population += 1

# class Human ends.

person = Human('Tom', 22, 'M')
person.increment_pop()
person.increment_pop()
print('Population : ', person.population)

person2 = Human('Anna', 24, 'F')
person2.increment_pop()
print('Population : ', person2.population)

print(Human.population)

Выход :

Population :  2
Population :  1
0

Значит, и у объекта, и у класса есть переменная population? В чем разница между переменной population и переменными внутри метода init ()?

Я знаю, что внутри метода init () находятся только переменные экземпляра.

2
Chinmay Ghule 13 Авг 2020 в 13:30

1 ответ

self ссылается на конкретный экземпляр класса. Когда вы вызываете increment_pop, вы используете self.population, который вызывает приращение только этого экземпляра. Поскольку в python вам не нужно вызывать инициализаторы, increment_pop создает новую переменную с именем self.population, где популяция переменных класса должна быть глобальной.

Измените increment_pop на cls.population, а не self.population, и он должен работать, как задумано. Обратите внимание, что в определении функции вам понадобится декоратор @classmethod и параметр cls.

0
samsonjm 13 Авг 2020 в 10:42