Deseando evitar una situación como esta:objetos Python - evitando la creación de atributo con nombre desconocido
>>> class Point:
x = 0
y = 0
>>> a = Point()
>>> a.X = 4 #whoops, typo creates new attribute capital x
yo creamos el siguiente objeto para ser utilizado como una superclase:
class StrictObject(object):
def __setattr__(self, item, value):
if item in dir(self):
object.__setattr__(self, item, value)
else:
raise AttributeError("Attribute " + item + " does not exist.")
Si bien esto parece para trabajar, la pitón documentation says of dir()
:
Nota: Debido a
dir()
se proporciona principalmente como una conveniencia para su uso en un mensaje interactivo, trata de proporcionar un conjunto interesante de nombres más de lo que intenta proporcionar un conjunto de nombres riguroso o consistentemente definido, y su comportamiento detallado puede cambiar a lo largo de las publicaciones. Por ejemplo, los atributos de metaclase no están en la lista de resultados cuando el argumento es una clase.
¿Hay una mejor manera de comprobar si un objeto tiene un atributo?
'__slots__' parece permitir algunas optimizaciones internas también. –
Otro buen uso de '__slots__' – smci