¿Cómo emular la sobrecarga del operador de asignación en Python?

¿Cómo se puede emular la sobrecarga del operador de asignación en Python? Por ejemplo…

class Example(object): name = String() age = Integer() def __init__(self,myname,myage): self.name.value = myname self.age.value = myage 

En lugar de hacer self.name.value = name, ¿cómo puedes emular la sobrecarga del operador de asignación para que myname se asigne a self.name.value cuando haces self.name = myname?

En este caso muy especial, en la asignación de atributos, puede utilizar un descriptor . De hecho, sospecho que en el ejemplo que está utilizando, Integer y String son en realidad descriptores.

Aparte de usar descriptores prefabricados, la forma más fácil de usar descriptores es con property() . Aquí hay un breve ejemplo:

 >>> class Foo(object): @property def bar(self): print 'bar' return 'bar' @bar.setter def bar(self, value): print 'bar =', value >>> afoo = Foo() >>> afoo.bar bar 'bar' >>> afoo.bar = 'baz' bar = baz >>> 

No puede sobrecargar el operador de asignación en python; sin embargo, con algunos métodos inteligentes de sobrecarga de métodos mágicos puede obtener A << = B + C al sobrecargar el método mágico rshift , para una guía completa sobre métodos mágicos de pitones, vea esto .

No puedes sobrecargar la asignación. No es un operador. Estaría mejor aquí simplemente construyendo el valor en el constructor de objetos.

 class Example(object): def __init__(self,myname, myage): self.name = String(myname) self.age = Integer(myage) 

Sin embargo, en este caso, no veo por qué no puede usar simplemente el str e int .

Terminé creando una metaclase de modelo llamada ModelMeta que registra los atributos escritos.

Consulte http://github.com/espeed/bulbs/blob/master/bulbs/model.py

En este caso, los atributos escritos son “propiedades” de la base de datos de gráficos, que son todas las subclases de la clase de propiedad.

Consulte https://github.com/espeed/bulbs/blob/master/bulbs/property.py

Aquí hay un ejemplo de statement de modelo:

 # people.py from bulbs.model import Node, Relationship from bulbs.property import String, Integer, DateTime from bulbs.utils import current_datetime class Person(Node): element_type = "person" name = String(nullable=False) age = Integer() class Knows(Relationship): label = "knows" created = DateTime(default=current_datetime, nullable=False) 

Ejemplo de uso:

 >>> from people import Person >>> from bulbs.neo4jserver import Graph >>> g = Graph() # Add a "people" proxy to the Graph object for the Person model: >>> g.add_proxy("people", Person) # Use it to create a Person node, which also saves it in the database: >>> james = g.people.create(name="James") >>> james.eid 3 >>> james.name 'James' # Get the node (again) from the database by its element ID: >>> james = g.people.get(james.eid) # Update the node and save it in the database: >>> james.age = 34 >>> james.save() # Lookup people using the Person model's primary index: >>> nodes = g.people.index.lookup(name="James") 

Ver…