python - __init__ 以函数作为参数(使用 NetworkX)

标签 python oop networkx

问题

我希望能够使用引用实例属性的函数来初始化对象。我想要在这个片段中捕获什么,它会产生一个 NameError: "global name 'self' is not Define":

class Test(object):
    def __init__(self, function = None):
        self.dicty = {1:{'height': 4, 'width': 2}, 2:{'height': 1, 'width': 2} }
        if function == None:
            self.function = lambda x : self.dicty[x]['height']
        else:
            self.function = function

if __name__ == '__main__':
    def func1(x):
        return self.dicty[x]['width']
    def func2(x):
        return self.dicty[x]['width']**2
    G = Test(function = func1)
    H = Test(function = func2)

我可以通过创建一堆子类来测试来解决问题,但这似乎不可读。

动机

我正在使用 NetworkX 进行 Python 建模和实验。我在看经典Albert-Barabasi Model并创建 DiGraph 类的子类,其中包括 Preference(self, node)Attachment(self,parent, child)Grow(self, max_allowable_nodes)。我希望能够创建一个修改 preference() 的实例,而不是像我之前提到的那样创建一大堆子类。这将使我能够运行数值实验,而不会让我的代码看起来太像弗兰肯斯坦。期待学习新东西。

编辑:

不了解types类或反射的一般概念。显然,这里还是很新的。非常感谢大家回答我的问题并为我指明正确的方向!

最佳答案

鉴于您在 __init__ 中创建的 lambda 引用了实例 (self),看起来您想要附加一个 < em>方法到您的实例,而在这里您附加一个函数。您需要从函数创建一个方法并将其附加到实例:

import types

class Test(object):
    def __init__(self, function = None):
        self.dicty = {1:{'height': 4, 'width': 2}, 2:{'height': 1, 'width': 2} }
        if function == None:
            function = lambda self, x: self.dicty[x]['height']
        self.function = types.MethodType(function, self)

方法基本上是一个总是将实例作为第一个参数传递的函数,因此您需要确保传递给初始化程序的任何函数都将 self 作为最初的论点。

>>> t1 = Test()
>>> t1.function(1)
4

>>> t2 = Test(lambda self, x: self.dicty[x]['width'])
>>> t2.function(1)
2

关于python - __init__ 以函数作为参数(使用 NetworkX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22926277/

相关文章:

python - 有向图并行排序

python - 如何在不同文件中应答另一个 python 程序 raw_input() 请求?

python - python中的XML解析(xml.etree.ElementTree)

java - 工厂创建的对象可以有构造函数吗?

oop - Doctrine2 ORM 不会保存对 DateTime 字段的更改

java - 使用 Java,您使用私有(private)方法吗?你使用静态方法吗?

python - 使用networkx从矩阵到图(有向和无向)

python - 在cmd中将参数传递给.exe文件

python - 如何用多行编写 python lambda?

Python NetworkX - 为什么图形总是随机旋转?