我有这个代码:
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)
怎么解决?
我正在尝试创建一个MySerial实例化串行对象的类 ( ),以便我可以写入/读取串行设备 (UART)。有一个实例方法,它是一个装饰器,它包裹着属于完全不同的类 ( App)的函数。所以装饰器负责写入和读取串行缓冲区。
如果我MySerial在App类内部创建了一个实例,我就不能使用从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中的实例方法在执行之前调用另一个方法?
一个简单的例子进行演示:
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”,我宁愿让它们全部在同一位置调用一次初始化,而不是手动调用每次调用该方法。这是元类可以做的事情吗?
我试图在我的类中创建一个方法来计算特定函数的完整运行。我想使用一个简单的装饰器。我找到了这个参考并重写了这个简单的脚本:
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) 我试图在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)"是我实际尝试的,因为我还没有解决我的问题.
我找不到这里的解决方案.有人知道这些东西吗?