如何在Python中模拟赋值运算符重载?

时间:2011-05-16 02:51:30

标签: python operator-overloading

如何在Python中模拟赋值运算符重载?例如......

class Example(object):

    name = String()
    age = Integer()

    def __init__(self,myname,myage):
        self.name.value = myname
        self.age.value = myage

你可以如何模拟赋值运算符的重载,以便在执行self.name = myname时将myname分配给self.name.value,而不是使用self.name.value = name。

4 个答案:

答案 0 :(得分:13)

在这种非常特殊的情况下,在属性分配中,您可以使用descriptor。实际上,我怀疑在您使用的示例中,IntegerString实际上是描述符。

除了使用预制描述符之外,使用描述符的最简单方法是使用property()。这是一个简短的例子:

>>> 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
>>> 

答案 1 :(得分:2)

你不能在python中重载赋值运算符但是通过一些聪明的魔术方法重载你可以通过重载 rshift 魔法来获得A<< = B + C,这是一个全面的指南关于蟒蛇魔术方法,请参阅this

答案 2 :(得分:0)

您不能超载分配。它不是运营商。你最好只在对象构造函数中构造值。

class Example(object):

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

但是在这种情况下,我不明白为什么你不能只使用内置的strint

答案 3 :(得分:0)

我最终创建了一个名为ModelMeta的模型元类,它注册了类型属性。

请参阅http://github.com/espeed/bulbs/blob/master/bulbs/model.py

在这种情况下,类型化属性是图数据库“属性”,它们都是Property类的子类。

请参阅https://github.com/espeed/bulbs/blob/master/bulbs/property.py

以下是模型声明的示例:

# 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)

使用示例:

>>> 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")

请参阅...