Как эмулировать перегрузку оператора присваивания в Python? - PullRequest
3 голосов
/ 16 мая 2011

Как вы можете эмулировать перегрузку оператора присваивания в Python? Например ...

class Example(object):

    name = String()
    age = Integer()

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

Вместо того, чтобы делать self.name.value = name, как вы можете эмулировать перегрузку оператора присваивания, чтобы myname присваивалось self.name.value, когда вы делаете self.name = myname?

Ответы [ 4 ]

13 голосов
/ 16 мая 2011

В этом особом случае при присвоении атрибута вы можете использовать descriptor. На самом деле, я подозреваю, что в используемом вами примере Integer и String на самом деле являются дескрипторами.

Помимо использования готовых дескрипторов, самый простой способ использовать дескрипторы с 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
>>> 
2 голосов
/ 16 мая 2011

Вы не можете перегрузить оператор присваивания в python, однако с помощью некоторой умной перегрузки магических методов вы можете получить A << = B + C, перегрузив магический метод <strong>rshift , для всестороннего руководства по магии питонов.методы см. это .

0 голосов
/ 18 ноября 2013

В итоге я создал метакласс Model с именем 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")

См ...

0 голосов
/ 16 мая 2011

Вы не можете перегрузить назначение. Это не оператор. Вам было бы лучше здесь просто построить значение в конструкторе объекта.

class Example(object):

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

Однако в этом случае я не понимаю, почему вы не можете просто использовать встроенные str и int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...