标签: wrapper

如何在不为每种方法反复输入的情况下装饰类的所有函数?

让我说我的类有很多方法,我想在每一个方法上应用我的装饰,后来当我添加新方法时,我想要应用相同的装饰器,但我不想在方法声明之上写@mydecorator所有时间?

如果我调查的__call__是正确的方法吗?

重要提示:以下示例似乎解决了与原始问题不同的问题.

编辑:我想以这种方式展示,这是我的问题的类似解决方案,对于任何人后来发现这个问题,使用评论中提到的mixin.

class WrapinMixin(object):
    def __call__(self, hey, you, *args):
        print 'entering', hey, you, repr(args)
        try:
            ret = getattr(self, hey)(you, *args)
            return ret
        except:
            ret = str(e)
            raise
        finally:
            print 'leaving', hey, repr(ret)
Run Code Online (Sandbox Code Playgroud)

然后你可以在另一个

class Wrapmymethodsaround(WrapinMixin): 
    def __call__:
         return super(Wrapmymethodsaround, self).__call__(hey, you, *args)
Run Code Online (Sandbox Code Playgroud)

python decorator wrapper

52
推荐指数
5
解决办法
3万
查看次数

在Java中使用==运算符来比较包装器对象

我正在阅读Kathy Sierra和Bert Bates的SCJP Java 6,这本书让我很困惑.在页245上,他们在下面说明以下代码.

Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2)
System.out.println("different objects");

//Prints output
different objects
Run Code Online (Sandbox Code Playgroud)

然后在下一页上,他们有以下代码

Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4)
System.out.println("same objects");

//Prints output
same objects
Run Code Online (Sandbox Code Playgroud)

我很困惑!当我自己尝试这个时,似乎你不能使用==来比较你使用equals()方法的方式.即使整数变量设置为相同的值(即10),使用==总是给我'假'.我对么?使用==来比较相同的Integer对象(具有相同的值)将始终导致'false'

java integer equals wrapper operator-keyword

51
推荐指数
3
解决办法
2万
查看次数

如何安全地包装`console.log`?

假设我想console.log为某些合法的生产原因包含一些调用,比如像单元测试工具这样的东西.显然,如果浏览器没有console,或者如果没有控制台,我不希望这会抛出一个过早的异常.

创建一个简单的log函数来将内容记录到控制台的最佳方法是什么,或者如果没有控制台,则默默地失败而没有错误?

上面提到的问题的答案是:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
Run Code Online (Sandbox Code Playgroud)

可以log在IE上正常调用此函数,apply这里的使用只是为了表明它是可能的吗?并且,我从链接的问题中假设,如果IE的控制台在运行时关闭,这将失败,因此log即使在控制台打开后也无法工作,对吗?如果这是错的,有人可以解释它是如何工作的吗?

这篇ycombinator文章似乎很相关.他们是否正在谈论与上面链接的问题相同的IE行为?

Function.prototype.apply.apply(console.log, [console, arguments]);
Run Code Online (Sandbox Code Playgroud)

适用于IE9破解的console.log和其他供应商的常规console.log.与使用Array.prototype.slice将参数转换为实数组相同的hack.

这在我的chrome控制台中运行良好.

function echo(){
  Function.prototype.apply.apply(console.log, [console, arguments]);
}
Run Code Online (Sandbox Code Playgroud)

简化:

function echo(){
  Function.apply.call(console.log, console, arguments);
}
Run Code Online (Sandbox Code Playgroud)

添加支票并返回:

function echo(){
  return window.console && console.log &&
         Function.apply.call(console.log, console, arguments);
}
Run Code Online (Sandbox Code Playgroud)

上面的例子对我来说足够了.不过,我手头没有IE来测试它.这是安全包装的合理方法console.log吗?


更多问题

按照下面导航答案中的链接,我们看到代码:

Function.prototype.call.call(console.log, console,
    Array.prototype.slice.call(arguments));
Run Code Online (Sandbox Code Playgroud)

arguments在这种情况下转换为数组的目的是什么?我想如果你不这样做,它必须在某些浏览器中失败?并且,除了歌剧奇怪的行为和无控制台的浏览器之外,这样的东西不应该适用于其他所有浏览器吗?并且确实prototype在上面的例子中起到了作用,或者我们只是在迂腐... Function.call.call或者Object.call.call或者就此而言isNaN.call.call似乎也是如此Function.prototype.call.call …

javascript console logging internet-explorer wrapper

47
推荐指数
4
解决办法
2万
查看次数

创建简单的c ++ .net包装器.一步步

我有一个c ++项目.我承认我在c ++中是一个完整的零.但是我仍然需要编写一个c ++ .net包装器,这样我就可以使用非托管的c ++库.所以我有:1)非托管项目的头文件.2)非托管项目的库(.dll和.lib)3)一个空的C++ .NET项目,我打算用它作为我的c#应用程序的包装器

我怎么开始?我甚至不知道如何设置对非托管库的引用.

SOS

.net c# c++ dll wrapper

43
推荐指数
2
解决办法
8万
查看次数

除了在python中包装try的一般装饰器?

我正在与许多深度嵌套的json进行交互,我没有写,并且想让我的python脚本对无效输入更"宽容".我发现自己编写了涉及try-except块的内容,而宁愿将这个可疑的函数包装起来.

我理解吞下异常是一个糟糕的政策,但我宁愿他们稍后打印和分析,而不是实际停止执行.在我的用例中继续执行循环而不是获取所有密钥更有价值.

这就是我现在正在做的事情:

try:
    item['a'] = myobject.get('key').METHOD_THAT_DOESNT_EXIST()
except:
    item['a'] = ''
try:
    item['b'] = OBJECT_THAT_DOESNT_EXIST.get('key2')
except:
    item['b'] = ''
try:
    item['c'] = func1(ARGUMENT_THAT_DOESNT_EXIST)
except:
    item['c'] = ''
...
try:
    item['z'] = FUNCTION_THAT_DOESNT_EXIST(myobject.method())
except:
    item['z'] = ''
Run Code Online (Sandbox Code Playgroud)

这是我想要的,(1):

item['a'] = f(myobject.get('key').get('subkey'))
item['b'] = f(myobject.get('key2'))
item['c'] = f(func1(myobject)
...
Run Code Online (Sandbox Code Playgroud)

或(2):

@f
def get_stuff():
   item={}
   item['a'] = myobject.get('key').get('subkey')
   item['b'] = myobject.get('key2')
   item['c'] = func1(myobject)
   ...
   return(item)
Run Code Online (Sandbox Code Playgroud)

...我可以将单个数据项(1)或主函数(2)包装在某个函数中,该函数将执行暂停异常转换为空字段,打印到stdout.前者将是一种逐项跳过 - 其中该键不可用,它记录为空白并继续前进 - 后者是行跳过,如果任何字段不起作用,则整个记录为跳过.

我的理解是某种包装应该能够解决这个问题.这是我尝试过的包装器:

def f(func):
   def silenceit():
      try:
         func(*args,**kwargs)
      except:
         print('Error')
      return(silenceit)
Run Code Online (Sandbox Code Playgroud)

这就是为什么它不起作用.调用一个不存在的函数,它不会尝试捕获它:

>>> …
Run Code Online (Sandbox Code Playgroud)

python try-catch decorator wrapper

41
推荐指数
7
解决办法
3万
查看次数

C++ Wrapper类的含义是什么?

我在理解包装类时有点麻烦.如果有人可以帮助提供适当的例子,那将是很好的.

  1. 什么是C++包装类以及编写它的具体情况是什么?
  2. 有什么用途?

谢谢.

c++ class wrapper

38
推荐指数
3
解决办法
7万
查看次数

vue - 如何传递包装器组件内的插槽?

所以我用模板创建了一个简单的包装器组件:

<wrapper>
   <b-table v-bind="$attrs" v-on="$listeners"></b-table>
</wrapper>
Run Code Online (Sandbox Code Playgroud)

使用$attrs$listeners传递道具和事件.
工作正常,但包装器如何代理<b-table>命名的插槽给孩子?

components wrapper vue.js vue-component

34
推荐指数
4
解决办法
8424
查看次数

将Integer []转换为int []数组

是否有一种将Integer数组转换为int数组的奇特方法?(我不想迭代每个元素;我正在寻找一种优雅而快速的方法来编写它)

我正在使用另一种方式

scaleTests.add(Arrays.stream(data).boxed().toArray(Double[]::new));

我正在寻找单线但无法找到的东西.

目标是:

int[] valuesPrimitives = <somehow cast> Integer[] valuesWrapper
Run Code Online (Sandbox Code Playgroud)

java arrays wrapper java-8

33
推荐指数
2
解决办法
3万
查看次数

如何使用varargin和varargout包装函数?

小例子:

function varargout = wrapper(varargin)
varargout = someFunction(varargin);
Run Code Online (Sandbox Code Playgroud)

这就是我先做的事情.但是,例如,如果someFunction = ndgrid这产生了未定义的单元格数组错误,那么下一次尝试就是使用了someFunction(varargin{:}).这是一个成功的通话,但是通话[a,b] = wrapper([1,2], [3,4])不会产生与直接通话相同的结果ndgrid,所以我做错了什么?

matlab variadic-functions wrapper

31
推荐指数
2
解决办法
1万
查看次数

在Java中获取包装类类型的简单方法

我有一段代码,我需要在方法中传递一个字段的类.由于我的代码的机制,我只能处理引用对象而不是基元.我想要一种简单的方法来确定一个Field类型是否是原始的,并用适当的包装类交换它.所以在代码中我到目前为止所做的是这样的:

Field f = getTheField(); // Dummy method that returns my Field
Class<?> c = f.getType();
if (c == int.class) {
    c = Integer.class;
}
else if (c == float.class) {
    c = Float.class;
}
// etc
myMethod(c);
Run Code Online (Sandbox Code Playgroud)

这工作正常,除了我需要显式检查所有基本类型并使用适当的包装类交换它们.现在我知道没有那么多原始类型,简单地列出它们就不会有问题,但我想知道是否有更简单,更优雅的方式.

java reflection wrapper

29
推荐指数
6
解决办法
2万
查看次数