相关疑难解决方法(0)

'staticmethod'对象不是可调用的开关/ case

我有这个代码:

class A(object):
    @staticmethod
    def open():
        return 123
    @staticmethod
    def proccess():
        return 456

    switch = {
        1: open,
        2: proccess,   
        }

obj = A.switch[1]()
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我不断收到错误:

TypeError: 'staticmethod' object is not callable
Run Code Online (Sandbox Code Playgroud)

怎么解决?


python

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

使用实例方法作为另一个类中的装饰器

我正在尝试创建一个MySerial实例化串行对象的类 ( ),以便我可以写入/读取串行设备 (UART)。有一个实例方法,它是一个装饰器,它包裹着属于完全不同的类 ( App)的函数。所以装饰器负责写入和读取串行缓冲区。

如果我MySerialApp类内部创建了一个实例,我就不能使用从MySerial. 我已经尝试了上述实例方法并使用类方法,如第二个答案中所述,但我确实需要实例化MySerial,从而使用__init__.

如何做到这一点?不可能吗?

  • 创建一个装饰器,它是一个实例方法。
  • 在另一个类中使用这个装饰器

class MySerial():
    def __init__(self):
        pass # I have to have an __init__
    def write(self):
        pass # write to buffer
    def read(self):
        pass # read to buffer
    def decorator(self, func):
        def func_wrap(*args, **kwargs):
            self.write(func(*args, **kwars))
            return self.read()
        return func_wrap

class App():
    def __init__(self):
        self.ser = MySerial()

    @self.ser.decorator  # <-- does not work here.
    def myfunc(self): …
Run Code Online (Sandbox Code Playgroud)

python patch mocking instance python-decorators

7
推荐指数
1
解决办法
1298
查看次数

Python,如何从实例方法“自动”调用函数/方法?

有没有办法强制Python中的实例方法在执行之前调用另一个方法?

一个简单的例子进行演示:

class MyClass(object):
  def __init__(self):
    pass
  def initialize(self):
    print "I'm doing some initialization"
  def myfunc(self):
    print "This is myfunc()!"
Run Code Online (Sandbox Code Playgroud)

我想要某种方法让 myfunc() 在运行之前自动调用initialize()。如果我做:

obj = MyClass()
obj.myfunc()
Run Code Online (Sandbox Code Playgroud)

我希望看到以下输出:

I'm doing some initialization 
This is myfunc()!
Run Code Online (Sandbox Code Playgroud)

无需在 myfunc() 中显式调用initialize()。

这样做的原因是,如果我有许多“myfunc”实例,例如 myfunc1、myfunc2、myfunc3,所有这些实例都需要调用“initialize”,我宁愿让它们全部在同一位置调用一次初始化,而不是手动调用每次调用该方法。这是元类可以做的事情吗?

python metaclass class

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

将装饰器定义为类内的方法

我试图在我的类中创建一个方法来计算特定函数的完整运行。我想使用一个简单的装饰器。我找到了这个参考并重写了这个简单的脚本:

class myclass:
    def __init__(self):
        self.cnt = 0

    def counter(function):
        """
        this method counts the runtime of a function
        """
        def wrapper(self, **args):
            function(**args)
            self.counter += 1
        return wrapper


@myclass.counter
def somefunc():
    print("hello from somefunc")


if __name__ == "__main__":
    obj = myclass()
    # or if comment @myclass.counter
    # somefunc = myclass.counter(somefunc)
    somefunc()
Run Code Online (Sandbox Code Playgroud)

当然,我得到:

TypeError: wrapper() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

我尝试将计数器重写为类方法:

class myclass:
    def __init__(self):
        self.cnt = 0

    def counter(self, function):
        """
        this method counts the runtime …
Run Code Online (Sandbox Code Playgroud)

python python-decorators

4
推荐指数
1
解决办法
8528
查看次数

将参数传递给装饰器的类方法将被装饰

我试图在flask中定义一个装饰器,最后将装饰传递该类实例参数的类方法.这是我真正想做的一个例子.

from functools import wraps
def user_permission(myname):
    def decorator(f):
        @wraps(f)
        def decorated(*args,**argws):
            if myname == 'My Name':
                return f(*args,**argws)
            else:
                return "Not Permitted"
        return decorated
    return decorator
Run Code Online (Sandbox Code Playgroud)

我的经理类定义为:

class Manager(flask.views.MethodView):

def __init__(self,name):
    self.name = name
@user_permission(self.my_name)
def post(self):
    return "Response"

def get(self):
    return "Response"
Run Code Online (Sandbox Code Playgroud)

我想要做的是将类变量传递给装饰器.是的"自我"在那时没有定义,但"@ decorator.user_permission(self.my_name)"是我实际尝试的,因为我还没有解决我的问题.

我找不到这里的解决方案.有人知道这些东西吗?

python decorator flask

3
推荐指数
1
解决办法
1454
查看次数