问题
我希望能够使用引用实例属性的函数来初始化对象。我想要在这个片段中捕获什么,它会产生一个 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/