【问题标题】:Problem with 'Overriding the StructuredNode constructor'“覆盖 StructuredNode 构造函数”的问题
【发布时间】:2018-10-18 21:33:52
【问题描述】:

我在尝试覆盖 StructuredNode 构造函数时遇到此错误,而它与文档中的代码几乎完全相同。

Traceback (most recent call last):
  File "/Users/xiao/PycharmProjects/Fooga_New/test/tmp.py", line 48, in <module>
    tmp_node = Item(test='test_test_test')
  File "/Users/xiao/PycharmProjects/Fooga_New/test/tmp.py", line 45, in __init__
    super(Item, self).__init__(self, *args, **kwargs)
  File "/Users/xiao/PycharmProjects/python3_venv/lib/python3.6/site-packages/neomodel/core.py", line 203, in __init__
    super(StructuredNode, self).__init__(*args, **kwargs)
TypeError: __init__() takes 1 positional argument but 2 were given

这是我的代码:

from neomodel import db, StructuredNode, StringProperty


db.set_connection('bolt://' + 'neo4j' + ':' + '5428' + '@' + '192.168.0.24' + ':' + '7687')


class Item(StructuredNode):
    name = StringProperty(unique_index=True)
    uid = StringProperty(unique_index=True)

    def __init__(self, test, *args, **kwargs):
        # self.product = product
        kwargs["uid"] = 'g.' + str(test)
        kwargs["name"] = test
        super(Item, self).__init__(self, *args, **kwargs)


tmp_node = Item(test='test_test_test')
tmp_node.save()

我想知道我是否正确使用了这个?

谢谢。

【问题讨论】:

  • 堆栈跟踪中的tmp_node 分配与您提供的代码中的分配不匹配(test 的值明显不同)。请确保您提供的代码肯定会产生错误,并提供代码产生的确切错误,否则我们无法确定我们正在查看的代码确实存在您所看到的问题。
  • 很抱歉。我已经进行了修改。

标签: python neo4j neomodel


【解决方案1】:

在继续之前请查看*args and **kwargs?

在您的示例中,您可以通过两种方式使用 test 参数:

from neomodel import db, StructuredNode, StringProperty
from neomodel import config

config.DATABASE_URL = 'bolt://neo4j:neo4j@localhost:7687'

# Using `*args`: The first parameter to the constructor defines the `test`

class Item(StructuredNode):
    uid = StringProperty(unique_index=True)
    name = StringProperty(unique_index=True)
    def __init__(self, *args, **kwargs):       
        if args:
            test = args[0]
            kwargs['uid'] = 'g.' + str(test)
            kwargs['name'] = test
            super(Item, self).__init__(**kwargs)
        else:
            print('no test')


item = Item('test_test_test')
item.save()

# or using `**kwargs`: a entry `test` in kwargs defines the `test` for uid and name

class Kitem(StructuredNode):
    uid = StringProperty(unique_index=True)
    name = StringProperty(unique_index=True)

    def __init__(self, *args, **kwargs):       
        if kwargs and 'test' in kwargs: 
            test = kwargs['test']
            kwargs.pop('test',None)
            kwargs['uid'] = 'g.' + str(test)
            kwargs['name'] = test
            super(Kitem, self).__init__(**kwargs)
        else:
            print('no test')


kitem = Kitem(test='test_test_test_k')
kitem.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 2014-04-11
    • 2022-12-06
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多