0

这可能是一个基本问题,但我是编程新手。我正在使用第三方 python 代码,它提供了一个带有事件和事件委托的类。事件和事件委托的语法如下:

    public Delegate Sub RequestEventDelegate (request As MDNPRequest, _
      response as MDNPResponseParser)

    public Event RequestEvent As MDNPRequest.RequestEventDelegate 

我编写了以下代码来订阅该事件,但无法正常工作。我不知道我做错了什么。

    Mreq = MDNPRequest()
    Mreq.RequestEvent += Mreq.RequestEventDelegate(handleResponseEvent)

    def handleResponseEvent (request, response):
        print ' event fired'

我将两行代码添加到打开通信通道的函数的末尾。我还测试了将这两行代码添加到在通信通道上发送轮询的函数中。在第二种情况下,事件触发并且每次我执行轮询功能。这是否违背了事件订阅的目的?


我认为我的问题可能是由于不同的函数创建了同一类的实例。我想使用下面显示的大纲将一些函数合并到一个类中。Method1 创建了我希望 myClass 中的其他方法使用的 class1 的实例“a”。我尝试使用我设置为 class1 实例的类变量,但这不起作用。我使用类名引用类变量,例如来自 class1 的 myClass.variable.somemethod 但我得到“对象引用未设置为对象的实例”错误。使 myClass 中的所有方法都可以访问 a 的最佳方法是什么?最终我想从另一个模块调用 myClass 。

    from file1 import *

    myClass:

       class_variable = class1() # class1 from file1

       def __init__(self)
       ...

       def Method1(self, argument list):
         # this method instantiates a  
          ...
          a = class1() 

       def Method2 (self):
          ...
          a.class1method1
          ...

       def Method3 (self):
          ...
          a.class1method2
          ...
4

2 回答 2

2

如果这实际上是您的代码:

Mreq.RequestEvent += Mreq.RequestEventDelegate(handleResponseEvent)

def handleRequestEvent (request, response):
    print ' event fired'

handleResponseEvent与. 不同handleRequestEvent


作为旁注,您几乎不需要创建显式委托。它有时是一个有用的优化,但它是你可能会出错的另一件事,也是另一件事可以在你这样做时伪装有用的调试信息,所以通常在没有它的情况下编写代码更简单,并且只将它添加为委托在它工作之后,如果你发现自己创建了很多它们并想节省一些内存。

于 2013-09-20T02:01:47.453 回答
0

从您以后的编辑中,我怀疑您缺少 Python 中类如何工作的基础知识。您可能想通读教程章节,或者搜索更友好/更详细的教程。

尤其是:

我想使用下面显示的大纲将一些函数合并到一个类中。Method1 创建了我希望 myClass 中的其他方法使用的 class1 的实例“a”。我尝试使用我设置为 class1 实例的类变量,但这不起作用。

这不是这样做的方法。类属性,如您的class_variable,是在类创建时创建的(即,通常在您import执行模块或运行脚本时),而不是实例创建时。如果您希望在创建类的实例时创建某些内容,则使用实例属性,而不是类属性,并在__init__方法中设置它们。在您的情况下,您不希望在实例Method1上调用该实例之前创建实例 - 这再次意味着您使用实例属性;你只是在里面做Method1而不是__init__

此外,类属性由类的所有实例共享;实例属性,每个实例都有自己的。关于狗:每条狗都有自己的尾巴,并不是所有的狗都共用一条尾巴,tail实例属性也是如此。通常,在简单的脚本中,您不会注意到差异,因为您只碰巧创建了一个类的实例。但是,如果您实际上无法弄清楚差异,请从概念上考虑(如Dog示例) - 如果您仍然无法弄清楚,您几乎总是需要一个实例属性。

我使用类名引用类变量,例如来自 class1 的 myClass.variable.somemethod 但我得到“对象引用未设置为对象的实例”错误。

这很可能是因为class1它是一个 COM/interop 或 .NET 类,并且您在进行任何相关设置之前尝试创建和使用它,这只是因为您试图在您import安装模块/运行脚本。如果是这样,如果您在实际打算时创建它,就不会有问题。

使 myClass 中的所有方法都可以访问 a 的最佳方法是什么?

在 中创建实例属性Method1,如下所示:

def Method1(self, argument list):
    # this method instantiates a  
     ...
    self.a = class1() 

然后以同样的方式使用它:

def Method2 (self):
     ...
    self.a.class1method1()
     ...

只是a = whatever创建一个局部变量,该变量在方法结束时消失。即使它碰巧与类属性、实例属性或全局属性同名,您仍在创建一个新的局部变量,而不是修改您要修改的内容。与其他一些语言不同,Python 要求您明确说明您要覆盖的内容——<code>self.a 用于实例属性、myClass.a类属性等——因此您不会意外地这样做。

另外,请注意最后一个表达式末尾的括号。如果要调用函数或方法,则需要括号;否则,您只是将方法本身作为值引用。


最终我想从另一个模块调用 myClass 。

我不确定您所说的“class myClass”是什么意思。当您调用一个类时,它会构造该类的一个新实例。然后,您可以像调用任何其他对象一样调用该实例的方法。它在哪个模块中定义并不重要(除非您显然必须编写my_instance = mymodule.MyClass())。

看看你是如何使用标准库的;完全一样。例如,如果您,您可以通过编写import csv来构造 a 。然后你通过写来调用它的方法。一旦你构建了它,它来自哪个模块并不重要。DictWritermy_writer = csv.DictWriter(my_file)my_writer.writerow(my_row)


还有一件事:

你试图定义一个这样的类:

myClass:

你显然不能那样做;你需要class关键字。而且,在 Python 2.x 中,您总是希望提供基类,object如果您不需要其他任何东西,就使用它。否则,你会得到一个老式的类,这会导致你不想了解并且必须调试的各种奇怪的怪癖和限制。所以:

class myClass(object):
于 2013-09-23T18:32:17.870 回答