Claro. Lo que pasa es que al principio puede parecer innecesario hacer un atributo privado (__tematica) si de todos modos vas a crear métodos para acceder y modificar su valor. Pero el punto real no es simplemente ocultarlo, sino tener control sobre cómo se accede o modifica.
En tu ejemplo, se usa property() para que puedas usar navidad.tematica como si fuera un atributo normal, pero internamente está pasando por los métodos _get_tematica y _set_tematica. Esto te permite, por ejemplo, más adelante poner validaciones, imprimir logs, calcular un valor en tiempo real, etc., sin cambiar la forma en que se usa desde fuera.
Te doy un ejemplo simple con validación, que muestra por qué esto es útil:
class GalletaConTematica:
def __init__(self, tematica):
self.__tematica = tematica
def get_tematica(self):
return self.__tematica
def set_tematica(self, value):
if value in ["Navidad", "Pascua", "Halloween"]:
self.__tematica = value
else:
print("Temática no válida")
tematica = property(get_tematica, set_tematica)
galleta = GalletaConTematica("Navidad")
print(galleta.tematica)
galleta.tematica = "Cumpleaños" # Este cambio no se permite
print(galleta.tematica)
Sin los métodos, no podrías evitar que alguien pusiera un valor que no tiene sentido para tu lógica. En resumen: sí, en este primer ejemplo no se ve tan necesario, pero cuando tu código crece, tener ese control se vuelve muy útil. Y usar property() te deja tener ese control sin cambiar la forma en que accedes a los datos desde fuera.