Пример структуры Python Bulbs аргумента fget в методе init объекта bulbs
Какова сфера действия fget=
аргумент при инициализации свойства класса Bulbs?
Например, когда я пишу:
from bulbs.model import Node, Relationship
from bulbs.property import String
class foobar(Node)
element_type = "foobar"
fget_property = String(fget=some_method)
Какие some_method
должно быть, чтобы fget_property был правильно определен? Должен ли он выполнять какую-либо операцию над другими свойствами класса или он также может быть функцией отношений, которые нравятся экземпляру класса, например, что-то вызывающее self.outV(some_relation)
?
1 ответ
Здесь значение для fget
должно быть именем метода, которое возвращает вычисленное значение. Имя метода должно ссылаться на метод, определенный в вашем классе Bulbs Model, а метод не должен иметь параметров.
fget
метод вызывается каждый раз, когда вы создаете / обновляете / сохраняете элемент в базе данных.
См. https://github.com/espeed/bulbs/blob/master/bulbs/model.py
Bulbs использует метакласс Python для установки fget
функционировать как питон property
на Model
class
вы определяете (не путать с базой данных Bulbs Property
, такие как String
в твоем примере).
См. Свойство класса Python (маленькая "p") и свойство базы данных Bulbs (большая "P")...
- Свойство класса Python https://docs.python.org/2/library/functions.html
- Свойство базы данных лампочек http://bulbflow.com/docs/api/bulbs/property/
Вот как fget
установлен на луковицы Model
Вы определяете:
class ModelMeta(type):
"""Metaclass used to set database Property definitions on Models."""
def __init__(cls, name, base, namespace):
"""Store Property instance definitions on the class as a dictionary."""
# Get inherited Properties
cls._properties = cls._get_initial_properties()
# Add new Properties
cls._register_properties(namespace)
### ...other class methods snipped for brevity... ###
def _initialize_property(cls, key, property_instance):
"""
Set the Model class attribute based on the Property definition.
:param key: Class attribute key
:type key: str
:param property_instance: Property instance
:type property_instance bulbs.property.Property
"""
if property_instance.fget:
fget = getattr(cls, property_instance.fget)
# TODO: implement fset and fdel (maybe)
fset = None
fdel = None
property_value = property(fget, fset, fdel)
else:
property_value = None
setattr(cls, key, property_value)
См. https://github.com/espeed/bulbs/blob/master/bulbs/model.py
Для обзора того, как метаклассы работают в Python, смотрите:
"Демистифицированные метаклассы" http://web.archive.org/web/20120503014702/http://cleverdevil.org/computing/78/
ОБНОВЛЕНИЕ: Вот полный рабочий пример объявления модели с использованием fget
метод...
# 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("calc_age")
def calc_age(self):
"""A pointless method that calculates a hard-coded age."""
age = 2014 - 1977
return age
class Knows(Relationship):
label = "knows"
timestamp = DateTime(default=current_datetime, nullable=False)
И вот полный рабочий пример того, как его использовать...
>>> from bulbs.rexster import Graph
>>> from people import Person, Knows
>>> g = Graph()
>>> g.add_proxy("people", Person)
>>> g.add_proxy("knows", Knows)
>>> james = g.people.create(name="James")
>>> julie = g.people.create(name="Julie")
>>> knows = g.knows.create(james, julie)
>>> print james.age
37
>>> print knows.timestamp
2014-08-04 21:28:31