我读过有关抽象基类的python文档:
从这里:
abc.abstractmethod(function)指示抽象方法的装饰员.使用这个装饰器需要该类的元类是
ABCMeta从它派生的.ABCMeta除非所有抽象方法和属性都被覆盖,否则无法实例化具有派生自元类的类.
而在这里
您可以将
@abstractmethod装饰器应用于必须实现的draw()等方法; 然后,Python将为未定义该方法的类引发异常.请注意,只有在您实际尝试创建缺少该方法的子类的实例时才会引发该异常.
我已经用这段代码测试了一下:
import abc
class AbstractClass(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def abstractMethod(self):
return
class ConcreteClass(AbstractClass):
def __init__(self):
self.me = "me"
c = ConcreteClass()
c.abstractMethod()
Run Code Online (Sandbox Code Playgroud)
代码很好,所以我不明白.如果我输入c.abstractMethod我得到:
<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>>
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?ConcreteClass 必须实现抽象方法,但我也不例外.
我熟悉select()C函数.我一直在为许多人使用这个功能.大多数(如果不是全部)读取和写入管道,文件等...我必须说我从未使用错误列表,但这不涉及关键问题.
python的select()行为如下吗?
事实证明,select()尽管C语言接口简单,但python的表现方式却不同select().它似乎select()在文件第一次准备好读取时返回.如果您读取文件中的字节,则调用select()将阻塞.但是,如果您select()在之前的呼叫之后再次呼叫select()而未在这两个呼叫之间进行任何读取呼叫而返回,select()则将按预期返回.例如:
import select
# Open the file (yes, playing around with joysticks)
file = open('/dev/input/js0', 'r')
# Hold on the select() function waiting
select.select([file], [], [])
# Say 16 bytes are sent to the file, select() will return.
([<open file '/dev/input/js0', mode 'r' at 0x7ff2949c96f0>], [], [])
# Call select() again, and select() will indeed return. …Run Code Online (Sandbox Code Playgroud) 我知道这听起来很重,但我正试图解决一个假设的情况.想象一下,你有一些物体的N个观察者.每个人都对对象状态感兴趣.应用Observer模式时,可观察对象倾向于迭代调用observer notify()|update()方法的观察者列表.
现在想象一下,特定的观察者有很多与可观察对象的状态有关的工作.例如,这会减慢上一次通知的速度.
因此,为了避免减慢对所有观察者的通知,我们可以做的一件事是在一个单独的线程中通知观察者.为了实现这一点,我想每个观察者都需要一个线程.这是一个痛苦的开销,我们正在努力避免因繁重工作导致的通知减慢.如果使用线程方法,最慢的是减速,是由无限循环引起的死线程.阅读这本有经验的程序员会很棒.
这是一个模糊的例子,以展示并希望澄清我甚至没有测试的基本思想:
class Observable(object):
def __init__(self):
self.queues = {}
def addObserver(self, observer):
if not observer in self.queues:
self.queues[observer] = Queue()
ot = ObserverThread(observer, self.queues[observer])
ot.start()
def removeObserver(self, observer):
if observer in self.queues:
self.queues[observer].put('die')
del self.queues[observer]
def notifyObservers(self, state):
for queue in self.queues.values():
queue.put(state)
class ObserverThread(Thread):
def __init__(self, observer, queue):
self.observer = observer
self.queue = queue
def run(self):
running = True
while running:
state = …Run Code Online (Sandbox Code Playgroud) 我用C编写了一个库.我使用SWIG为Java,Python等生成绑定.我设法为两种语言编写自定义类型映射等等.我还设法使用我的库(一个自定义协议)并与我在C中编写的服务器进行通信,使用我用Java编写的客户端,以及我用Python编写的客户端.
最近,我遇到了一个多重继承问题,我找到了一个聪明的解决方案.但是,当尝试使用Python 3复制错误时,错误消失了(可能在版本3中解决了).事实是,相同的代码,相同的项目和相同的源将不会运行调用python3二进制文件,但它可以调用python2.7二进制文件.
我收到消息:
ImportError: dynamic module does not define init function (PyInit__pytellapic)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了SWIG文档可能意味着什么,但错误略有不同:
import example
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ImportError: dynamic module does not define init function (init_example)
Run Code Online (Sandbox Code Playgroud)
说:
当为共享对象文件指定错误名称时,几乎总是会导致此错误.例如,如果您创建了一个文件example.so而不是_example.so,则会出现此错误.或者,如果模块的名称与%module指令提供的模块名称不一致,则可能会出现此错误.仔细检查接口以确保模块名称和共享对象文件名匹配.导致此错误的另一个可能原因是在创建扩展模块时忘记将SWIG生成的包装器代码与应用程序的其余部分链接起来.
老实说,我认为这个可能的原因不适用于我的模块,因为它应该是2.7和3版python的错误,而不仅仅是Python 3.
我很感激任何建议,但考虑到SWIG似乎是一个过时的项目,我可能会继续使用Python 2.7与提到的"黑客".
最好的祝福,
我一直在环顾四周,除了qt设计师版本3.x的Qt3旧文档外,我还没有找到任何东西.
我将留下一个例子,而不是我不能给代码,因为我的项目是GPL,但为了简单起见.
示例:您正在为应用程序设计GUI.您在GUI中插入了一些按钮,并且您希望这些按钮使用可能已经编写的逻辑执行某些操作.
问题:如何添加或设置此代码的方式是,选中按钮时会触发该代码?
我不想将小部件与信号/插槽连接.我的方法是在动作编辑器中创建一个自定义动作,并将所需按钮连接到该动作,希望找到一种方法来为该动作编写代码.我可以定义它的名称,它的图标(?),等等.但我需要编写它的逻辑/代码.
我读了一些文件,指示您创建一个C++头文件,但它似乎过时了新的Qt Designer的版本(4.7.3).我发现的关于我的问题的另一个巨大的资源是关于在默认对象操作之间汇合信号.我再说一遍,这不是我需要/想要的.
我的问题源于我不想编辑生成的.py.我觉得它必须是一种用自定义动作代码设置文件(自定义代码,头文件等)的方法,但老实说,我还找不到任何东西.
如果是否定答案(即"不可能这样做"),那么听一些"黑客"代码的建议会很高兴.我真的不喜欢修改生成的.py,ui.callback在我的代码中执行类似的操作似乎很难看.
问候,