Почему поле класса будет общим для дочерних классов?

#python #class #inheritance

#python #класс #наследование

Вопрос:

Мой глупый, я просто обнаружил, что это статическая переменная в python.

Я нахожу странную вещь в python, если поле класса init не in __init__ будет чем-то вроде static (общим для всех дочерних классов):

 # -*- coding: utf-8 -*-

class P:
    mem = list()

    def test(self):
        pass


class C1(P):
    def test(self):
        self.mem.append(1)


class C2(P):
    pass


if __name__ == "__main__":
    c1 = C1()
    c2 = C2()

    c1.test()
    print(c2.mem) # output [1]
 

Я нахожу, что оно будет выведено [1] в конце концов, потому что оно изменено c1 .

 # -*- coding: utf-8 -*-

class P:
    def __init__(self):
        self.mem = list()

    def test(self):
        pass


class C1(P):
    def test(self):
        self.mem.append(1)


class C2(P):
    pass


if __name__ == "__main__":
    c1 = C1()
    c2 = C2()

    c1.test()
    print(c2.mem) # output []
 

Затем я меняю его на __init__ function, оно не будет использоваться всеми дочерними классами.

Я просто хочу знать причину, по которой оно будет использоваться совместно дочерними классами в первом коде?

Комментарии:

1. «Я нахожу странную вещь в python, если поле класса init не in __init__ будет чем-то вроде static» — да, это синтаксис для статической переменной в Python.

2. Переменные во внешних методах создаются один раз при определении класса. Если вы назначаете его, __init__() он создается заново для каждого экземпляра.

Ответ №1:

Причиной этого является разница между атрибутами класса и атрибутами экземпляра. Когда вы определяете атрибут в самом классе, как в вашем первом примере, он является общим для всех экземпляров этого класса и любого из его подклассов. Это означает, что если вы измените его в любом экземпляре, оно будет изменено и во всех других экземплярах.

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