从另一个方法访问python中的内部方法
我试图从另一个方法访问python中的内部方法,但这样做会给我“AttributeError:‘function’对象没有属性‘b’” 我的设想是:从另一个方法访问python中的内部方法,python,Python,我试图从另一个方法访问python中的内部方法,但这样做会给我“AttributeError:‘function’对象没有属性‘b’” 我的设想是: class Foo: def first_method(self): something def test(self): print 'Hi' def second_method(self): a = self.test() 行a=self.test()。如果您
class Foo:
def first_method(self):
something
def test(self):
print 'Hi'
def second_method(self):
a = self.test()
行
a=self.test()。如果您想在其他功能中访问它,您必须在某处保留对它的引用。类似于以下的方法将起作用:
>>> class Foo:
... def first_method(self):
... def test():
... print 'Hi'
... self.test = test
... def second_method(self):
... self.test()
...
>>> f = Foo()
>>> f.second_method()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in second_method
AttributeError: Foo instance has no attribute 'test'
>>> f.first_method()
>>> f.second_method()
Hi
>>类Foo:
... def第一法(自):
... def test():
... 打印“嗨”
... 自我测试
... def第二法(自):
... self.test()
...
>>>f=Foo()
>>>f.第二种方法()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第7行,第二种方法
AttributeError:Foo实例没有属性“test”
>>>f.第一种方法()
>>>f.第二种方法()
你好
请注意,代码中的问题有一些更改。例如,函数test
不接受任何参数。还要注意的是,在调用第一个\u方法之前必须先调用第二个\u方法
函数测试
仅在第一个\u方法
的本地范围内可用。如果您想在其他功能中访问它,您必须在某处保留对它的引用。类似于以下的方法将起作用:
>>> class Foo:
... def first_method(self):
... def test():
... print 'Hi'
... self.test = test
... def second_method(self):
... self.test()
...
>>> f = Foo()
>>> f.second_method()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in second_method
AttributeError: Foo instance has no attribute 'test'
>>> f.first_method()
>>> f.second_method()
Hi
>>类Foo:
... def第一法(自):
... def test():
... 打印“嗨”
... 自我测试
... def第二法(自):
... self.test()
...
>>>f=Foo()
>>>f.第二种方法()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第7行,第二种方法
AttributeError:Foo实例没有属性“test”
>>>f.第一种方法()
>>>f.第二种方法()
你好
请注意,代码中的问题有一些更改。例如,函数test
不接受任何参数。还要注意的是,如果您希望test()
成为Foo
的一个正常方法,那么必须在second\u方法之前调用first\u方法
,是否有任何理由不将test()
定义为Foo
的正常方法,而是定义为first\u方法()
中的一个本地函数?您不能这样做。你为什么要这样做?如果你想test()
成为Foo
的一个普通方法,你有什么理由不把test()
定义为Foo
的一个普通方法,而是定义为first\u method()
中的一个本地函数吗?你不能。为什么要这样做?请注意,分配给实例属性的函数不是方法;调用时,它们没有访问实例的权限,也就是说,它们不会通过self
@SvenMarnach,它们不会通过self
,但在这段代码中,这并不意味着它们没有访问它的权限(由于闭包语义)。另外,在其他情况下,通过执行self.test=types.MethodType(test,self)
@lvc:完全同意,这个问题是可以解决的。我只是认为这是一个需要注意的问题,特别是因为OP为本地函数test()
使用了显式的self
参数;调用时,它们没有访问实例的权限,也就是说,它们不会通过self
@SvenMarnach,它们不会通过self
,但在这段代码中,这并不意味着它们没有访问它的权限(由于闭包语义)。另外,在其他情况下,通过执行self.test=types.MethodType(test,self)
@lvc:完全同意,这个问题是可以解决的。我只是认为这是一个需要注意的问题,特别是因为OP为本地函数test()
使用了显式的self
参数。