我正在构建函数管道,我需要知道打开了多少个类实例来为每个函数建立索引,我还需要将初始化计数器的“开始”参数设置为0,因为它处理同一管道多次运行而计数没有超过限制。
首先,我建立了一种仅在一个管道上运行良好的方法,因为Counter与其他管道类共享”>
class Foo3(): class Counter: def __init__(self,func): self.counter = 0 self.func = func #Counter.method =method def __call__(self,*args, **kwds): self.counter += 1 return self.func(*args, **kwds) #count= Counter() string = 'this is ' start = True def __init__(self, name): self.name = name #self.method = method self.ainit(self) self.newinst() print(self.newinst.counter) @Counter def newinst(): pass @classmethod def ainit(cls,inst): print(cls.string +inst.name) @classmethod def getCount(cls,inst): print(self.newinst.counter) class pipe1(Foo3): pass class pipe2(Foo3): pass pipe1('test') pipe1('test2') pipe1('test3') pipe2('test_new')
输出
this is test 1 this is test2 2 this is test3 3 this is test_new 4
现在,我试图找出如何在Counter类内传递启动方法,以指示管道从何处开始。但是我的解决方案无法正常工作,因为我尝试以错误的方式使用@static方法
class Foo3(): class Counter: method = 'regular' def __init__(self,func,method:str='regular' ): self.counter = 0 self.func = func Counter.method =method def __call__(self,method,*args, **kwds): if Counter.method == 'Start': print('count = 0') self.counter = 0 if Counter.method == 'regular' : print('+1') self.counter += 1 return self.func(*args, **kwds) #count= Counter() string = 'this is ' start = True @Counter @staticmethod def newinst(method='regular'): pass def __init__(self, name, method:str='regular'): self.name = name self.method = method print(self.ainit(self)) Foo3.newinst(method) print(self.newinst.counter) @classmethod def ainit(cls,inst): print(cls.string +inst.name) @classmethod def getCount(cls,inst): print(self.newinst.counter)
如果我使用计数器类作为解决方案,那是因为我希望每个管道有一个计数
class pipe1(Foo3): pass class pipe2(Foo3): pass pipe1('test', 'Start') pipe1('test2') pipe1('test3') pipe2('test_new', 'Start') pipe1.getCount() pipe2.getCount()
预期输出:
this is test 1 this is test2 2 this is test3 3 this is test_new 1 3 1
但是我得到问题了:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-440-1710b9b56152> in <module>
54
55 if __name__ == "__main__":
---> 56 Foo3('a')
<ipython-input-440-1710b9b56152> in __init__(self, name, method)
43 self.name = name
44 self.method = method
---> 45 Foo3.newinst(method)
46 print(self.newinst.counter)
47
<ipython-input-440-1710b9b56152> in __call__(self, method, *args, **kwds)
29 print('+1')
30 self.counter += 1
---> 31 return self.func(*args, **kwds)
32
33
TypeError: 'staticmethod' object is not callable
我正在建立一个函数管道,我需要知道打开了多少个类实例来为每个函数建立索引,我还需要将初始化计数器的'Start'参数设置为0,因为它会多次处理运行...] >
我找到解决方法
class Foo3():
class Counter:
method = 'regular'
def __init__(self,func, method= 'regular'):
self.counter = 0
self.func = func
#print(method)
Counter.method =method
#print(Counter.method)
def __call__(self,*args,method ='regular', **kwds):
if method == 'Start':
self.counter =0
elif method =='regular':
self.counter += 1
else :
raise Exception("this method doesn't exist")
return self.func(*args, **kwds)
#count= Counter()
string = 'this is '
start = True
@Counter
def newinst(method='regular'):
pass
def __init__(self, name, method= 'regular'):
self.name = name
#self.method = method
self.ainit(self)
self.newinst(method=method)
print(self.newinst.counter)
@classmethod
def ainit(cls,inst):
print(cls.string +inst.name)
@classmethod
def getCount(cls,inst):
print(self.newinst.counter)