Conforme mencionado em "Usando classes no Python 1", variáveis e métodos de classe são divididos em variáveis de classe (métodos de classe) e variáveis de instância (métodos de instância). Então, qual é a relação entre essas duas variáveis (métodos)? Pegue a classe MyClass mencionada em "Usando Classes em Python 1" como exemplo, seu código é o seguinte:
class MyClass:
i = 1
def myfunc():
print('Hello')
def __init__(self, num):
self.j = num
Entre eles, i e myfunc são variáveis de classe e métodos de classe de MyClass, e j é uma variável de membro de MyClass.
1 Acessando variáveis de classe por nome de instância
As variáveis de classe são comuns a cada instância e as variáveis de instância são exclusivas de cada instância.
Após definir MyClass, continue definindo duas instâncias desta classe, c1 e c2, o código é o seguinte:
c1 = MyClass(10)
c2 = MyClass(100)
Conforme mencionado em "Usando classes no Python 1", as variáveis de classe podem ser usadas na forma de "nome da classe. nome da variável". Além deste método, as variáveis de classe também podem ser usadas na forma de "nome da instância.nome da variável", o código é o seguinte:
print(c1.i)
print(c2.i)
Como todas as instâncias compartilham a variável de classe, a saída do código acima é 1.
Quando a variável de classe é modificada pelo nome da classe, o código é o seguinte
MyClass.i = 2
print(c1.i)
print(c2.i)
Como a variável de classe é compartilhada por cada instância, a saída neste momento é 2.
2 Modifique variáveis de classe por nome de instância
Em "1 Acessando variáveis de classe por meio de nomes de instância", é mencionado que variáveis de classe podem ser usadas como "nome de instância.nome de variável" e variáveis de classe também podem ser modificadas da mesma maneira. O código fica assim:
c1.i = 2
print(c1.i)
A saída neste momento é 2.
Deve-se notar que quando uma variável de classe é modificada através do método "nome da instância. nome da variável", é equivalente a recriar uma nova "variável de instância" para a instância sem afetar a variável de classe real. O código é o seguinte :
c1.i = 2
print(MyClass.i)
print(c2.i)
Ambas as saídas neste momento são "1".
3 Variáveis de instância não podem ser usadas e modificadas pelo nome da classe
As variáveis de classe podem ser usadas e modificadas pelo nome da instância, mas não vice-versa, ou seja, as variáveis de instância não podem ser usadas e modificadas pelo método "nome da classe. nome da variável".
print(MyClass.j)
O código acima relatará um erro e a mensagem de erro é "AttributeError: type object 'MyClass' has no attribute 'j'", indicando que a classe MyClass não possui uma variável de classe denominada "j".