python - 具有内部类的计数器实例方法
问题描述
我正在构建一个函数管道,我需要知道为索引每个函数打开了多少个类实例,我还需要将 init 计数器的“开始”参数设置为 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 类中传递一个 start 方法,以指示管道从哪里开始。但是我的解决方案不起作用,因为我尝试以错误的方式使用 @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
解决方案
我找到了解决方案
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)
输出
class pipe1(Foo3):
pass
class pipe2(Foo3):
pass
pipe1('test', 'Start')
pipe1('test2')
pipe1('test3')
pipe2('test_new','Start')
this is test
0
this is test2
1
this is test3
2
this is test_new
0
我的错误来自我对decorator
和内部的薄弱知识Class
,在我的例子中,__init__
即使在我构建管道之前,Counter 的功能也是实例化的,然后我没有弄清楚如何在参数中传递“Start”,因为我在init函数中设置它. 现在我的另一个问题 - 正如@MisterMiyagi 提到的那样 - 来自我的 getCount()
函数不应该工作并且我最好将 Counter 类排除在外的事实,但我仍然没有弄清楚如何在不指定继承的情况下打开一个Counter
实例在“管道类全局”参数中。pipeline
Foo3
推荐阅读
- java - 我不知道如何在 JAVA 中正确使用“尝试”
- r - 在 flexdashboard 中单击时更改第二个标签集
- sql - 在两个实体之间使用多个 M2M 关系是个好主意吗?
- javascript - 我正在编写代码以使用 ExpressJS 将表单输入从用户上传到 Mysql 数据库,但出现无法发布的错误
- ionic-framework - ionic 3 应用内浏览器在应用中获取点击事件
- php - where 子句中的日期比较未按预期工作
- excel - MS Excel 自定义 unicode 函数
- javascript - 当我在 Safari 浏览器中看到数据时,数据未加载到反应表中
- wordpress - Woocommerce/WordPress 巴克莱卡支付网关
- c++ - 在 C++ 中将矩阵与两个 for 循环相乘