#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:
Причиной этого является разница между атрибутами класса и атрибутами экземпляра. Когда вы определяете атрибут в самом классе, как в вашем первом примере, он является общим для всех экземпляров этого класса и любого из его подклассов. Это означает, что если вы измените его в любом экземпляре, оно будет изменено и во всех других экземплярах.
Если вы вместо этого создадите атрибут экземпляра, как вы сделали во втором примере, то он будет уникальным для этого экземпляра и не будет использоваться совместно с другими.