You are correct that using **kwargs to update the class is almost twice as slow compared to manually setting each variable. However there should be no issues with two separate class objects overwriting one another. Reference:
import timeit
class A:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
class B:
def __init__(self, **kwargs):
for k, v in kwargs.items():
setattr(self, k, v)
class C:
def __init__(self, name, age):
self.name = name
self.age = age
def initialize_class_a():
a = A(name="J Smith", age=20)
b = A(name="B Jones", age=40)
return a.name, b.name
def initialise_class_b():
a = B(name="J Smith", age=20)
b = B(name="B Jones", age=40)
return a.name, b.name
def initialise_class_c():
a = C(name="J Smith", age=20)
b = C(name="B Jones", age=40)
return a.name, b.name
print(initialize_class_a())
# ('J Smith', 'B Jones')
print(initialise_class_b())
# ('J Smith', 'B Jones')
print(initialise_class_c())
# ('J Smith', 'B Jones')
print(timeit.timeit("initialize_class_a()", "from __main__ import initialize_class_a"))
# 1.93
print(timeit.timeit("initialise_class_b()", "from __main__ import initialise_class_b"))
# 2.19
print(timeit.timeit("initialise_class_c()", "from __main__ import initialise_class_c"))
# 1.03
Notice that in each run the name of the two separate class objects, a.name and b.name, are still reporting to be different.