这是我的意思的一个例子:
class MyDecorator(object):
def __call__(self, func):
# At which point would I be able to access the decorated method's parent class's instance?
# In the below example, I would want to access from here: myinstance
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
class SomeClass(object):
##self.name = 'John' #error here
name="John"
@MyDecorator()
def nameprinter(self):
print(self.name)
myinstance = SomeClass()
myinstance.nameprinter()
Run Code Online (Sandbox Code Playgroud)
我需要装饰实际的课吗?
我只是在.NET中调用kernel32中的GetPrivateProfileString和GetPrivateProfileSection,并遇到了一些我不理解的奇怪事情.
让我们从这个咒语开始:
Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringW" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString() As Char, _
ByVal nSize As Int32, _
ByVal lpFileName As String) As Int32
Run Code Online (Sandbox Code Playgroud)
如果我传递一个lpApplicationName(section),没有lpKeyName而没有lpDefault,我应该得到该部分的所有密钥,而且确实是这样:50%的时间.
如果ini文件在第一行开始有lpApplicationName,则缓冲区不返回任何内容.如果lpApplicationName统计信息位于文件的第二行,则返回预期值.
起初我虽然是在Declare中使用W版本和Unicode的问题,但改变它们似乎没有任何效果.
我错过了什么?
我正在处理 Win32 控件。此控件上可能有数百个“项目”。这些不是窗口,而是内部对象(例如:矩形)。根据鼠标位置,我想更改鼠标光标。没关系,我可以使用 WM_SETCURSOR。
同时基于鼠标移动,我想显示一个状态栏,显示当前鼠标下对象的详细信息。为此,我可以使用 WM_MOUSEMOVE。
因为可能有数百个项目,移动所有项目在鼠标下找到一个,效率不高,尤其是两次(一次用于设置光标,一次用于鼠标移动)。
简而言之,您知道 WM_SETCURSOR 和 WM_MOUSEMOVE 是否总是成对的吗?在这种情况下,我可以在 WM_SETCURSOR 期间计算我想要的。另一种选择是在 WM_MOUSEMOVE 期间设置鼠标光标,但据我所知,这不是一个好的解决方案(会闪烁)。
谢谢
我一直在阅读有关子类化的MSDN文档,我已成功处理子类中的事件
我的问题是将消息传递回原始的WndProc.
例如,如果我有一个窗口,具有子类别组框控件和一个按钮作为该组框的子项,我想处理原始窗口过程中的按钮事件,而不是子类化的组框过程.
基本上,我想要一个空的子类过程:
LRESULT FAR PASCAL SubClassFunc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
return CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
oldProc的位置是:
FARPROC oldProc = (FARPROC)SetClassLong(group_box, GCL_WDPROC, (DWORD)SubCLassFunc);
Run Code Online (Sandbox Code Playgroud)
窗口和组框和按钮的位置是:
HWND window = CreateWindowEx(
WS_EX_WINDOWEDGE,
appname,
TEXT("Subclass Test"),
WS_VISIBLE |WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
300,
400,
NULL,
NULL,
hInstance,
0);
HWND group_box = CreateWindowEx(
0,
TEXT("BUTTON"),
TEXT("Group Box"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
8,
8,
275,
350,
window,
NULL,
hInstance,
0);
HWND push_button = CreateWindowEx(
0,
TEXT("BUTTON"),
TEXT("Push Button"), …Run Code Online (Sandbox Code Playgroud) 多字符串(双空格终止的空字符串字符串)在Windows API中很常见.将从API返回的多字符串转换为C#字符串集合的好方法是什么,反之亦然?
我对正确处理字符编码特别感兴趣(稍后是Windows XP).
以下方法似乎可以创建多字符串,但我没有解码多字符串的示例.
static string StringArrayToMultiString(
ICollection<string> stringArray
)
{
StringBuilder multiString = new StringBuilder();
if (stringArray != null)
{
foreach (string s in stringArray)
{
multiString.Append(s);
multiString.Append('\0');
}
}
return multiString.ToString();
}
Run Code Online (Sandbox Code Playgroud) 拥有打开的应用程序的窗口句柄,我可以使用GetWindowText函数从应用程序的标题栏中检索文本.我想更进一步,并检索与同一个应用程序关联的图标.
我该怎么做呢?我查看了我认为相关的Win32 API部分,但没有任何内容跳出来.
任何指针将不胜感激.
提前致谢!
当我在python中注销Windows时,如何检测或通知?
编辑:Martinv.Löwis的回答很好,并且可以完全注销,但它不能用于"快速用户切换"事件,例如按下win + L,这是我真正需要的.
编辑:我不使用gui这是作为服务运行
我对视图有十几个权限查询,确保用户具有在系统上执行某些操作的正确权限(即确保他们在正确的组中,如果他们可以编辑他们的个人资料,如果他们是组管理员,等等).
支票可能如下所示:
from django.contrib.auth.decorators import user_passes_test
test_canvote = lambda u: u.has_perm('polls.can_vote')
@user_passes_test(test_canvote)
def my_view(request):
# ...
Run Code Online (Sandbox Code Playgroud)
这实际上是来自Django教程的代码(我的有点丑陋).有时检查是数据库密集型的,会触发多个查询.由于许多用户访问权限检查页面,事情很快就会变得很慢.
我的问题是,我可以(在你的帮助下)为user_passes_test装饰器构建一个包装器(或替换件),该装饰器在缓存中搜索一个键'TESTCACHE' + user.pk + 'testname',如果它不存在,则执行测试并保存其结果.
我之前从未写过装饰器,但我想它看起来几乎与那个装饰器相同user_passes_test,只是将测试作为字符串传递:
@cached_user_passes_test('test_canvote')
def my_view(request):
# ...
Run Code Online (Sandbox Code Playgroud)
和以前一样,让我知道我是否疯了,或者Django是否已经为我做过这样的事情(所以我在其他地方遇到了问题).
Edit: The standard decorators can be found here: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/decorators.py
I think it might be easier replacing user_passes_test than wrapping it so here's the starting point. Of course, if you feel I'm incorrect in that statement, let me know:
try:
from functools import update_wrapper, wraps
except ImportError:
from …Run Code Online (Sandbox Code Playgroud) 虽然我知道你不能self直接在装饰器中引用,但我想知道通过拉动它来解决这个问题是不好的做法args[0].我的预感是,但我想确定.
更具体地说,我正在开发一个Web服务的API.大约一半的命令需要传递令牌,稍后可以使用它来撤消它.我想要的是使该标记成为可选参数,如果没有提供,则生成一个.生成令牌需要对服务器进行经过身份验证的调用,该服务器需要来自对象的数据.
虽然我知道我能做到:
def some_command(self, ..., undo_token = None):
if undo_token = None:
undo_token = self.get_undo_token()
...
return fnord
Run Code Online (Sandbox Code Playgroud)
我觉得有一种更好的方法,而不是在十几种方法中使用相同的代码.我的想法是写一个装饰者:
@decorator
def undoable(fn, *args, **kwargs):
if 'undo_token' not in kwargs:
kwargs['undo_token'] = args[0].get_undo_token()
return (fn(*args, **kwargs), kwargs['undo_token'])
Run Code Online (Sandbox Code Playgroud)
所以我可以更干净地写
@undoable
def some_command(self, ...):
...
return foo
@undoable
def some_other_command(self, ...):
...
return bar
Run Code Online (Sandbox Code Playgroud)
我是否因为遇到麻烦而陷入困境?