Eu tenho uma classe aninhada que usa variáveis estáticas para ter parâmetros e acumuladores em toda a classe.
Se eu fizer isso como uma classe autônoma, funciona.
Se eu criar uma classe aninhada e herdar a classe autônoma, funciona.
Mas não consigo fazer com que uma classe aninhada tenha variáveis de classe estáticas, o interpretador fica confuso. O que estou fazendo errado?
Trecho de código:
class Cl_static_parameter_standalone:
#static var common to all instances. Two uses: common settings, common accumulator
c_n_counter : int = 0
@staticmethod
def increment() -> int:
Cl_static_parameter_standalone.c_n_counter += 1
return Cl_static_parameter_standalone.c_n_counter
class Cl_some_class:
class Cl_static_parameter_inherited(Cl_static_parameter_standalone):
pass
class Cl_static_parameter_nested:
c_n_counter : int = 0
@staticmethod
def increment() -> int:
Cl_static_parameter_nested.c_n_counter += 1
return Cl_static_parameter_nested.c_n_counter
def __init__(self):
return
def do_something(self):
print(f"Execute Standalone: {Cl_static_parameter_standalone.increment()}")
print(f"Execute Inherited: {self.Cl_static_parameter_inherited.increment()}")
print(f"Execute Nested: {self.Cl_static_parameter_nested.increment()}")
return
my_instance = Cl_some_class()
my_instance.do_something()
Saída:
Execute Standalone: 1
Execute Inherited: 2
Traceback (most recent call last):
File "stack_overflow_class_static_parameter.py", line 52, in <module>
my_instance.do_something()
~~~~~~~~~~~~~~~~~~~~~~~~^^
File "stack_overflow_class_static_parameter.py", line 48, in do_something
print(f"Execute Nested:{self.Cl_static_parameter_nested.increment()}")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "stack_overflow_class_static_parameter.py", line 38, in increment
Cl_static_parameter_nested.c_n_counter += 1
^^^^^^^^^^^^^^^^^^^^^^^^^^
NameError: name 'Cl_static_parameter_nested' is not defined. Did you mean: 'Cl_static_parameter_standalone'?
Você pode usar o
classmethod
decorador, que é mais apropriado para essa situação de qualquer maneira:Se você está se perguntando por que
increment
não consegue encontrarCl_static_parameter_nested
no seu exemplo: você teria que escreverCl_some_class.Cl_static_parameter_nested
para acessá-lo a partir do namespace global.