Метод экземпляра счетчика с внутренним классом - PullRequest
0 голосов
/ 09 апреля 2020

Я строю конвейер функции и мне нужно знать, сколько экземпляров класса открыто для индексации каждой функции, также мне нужно установить параметр 'Start' для init счетчика в 0, так как он обрабатывает много раз один и тот же конвейер без число увеличивается выше предела.

Сначала я строю метод, который хорошо работает только с одним конвейером, поскольку счетчик используется совместно для каждого класса конвейера

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')

output

this is test
1
this is test2
2
this is test3
3
this is test_new
4

Теперь я попытаюсь выяснить, как передать метод start в классе счетчиков, чтобы указать, где начинается трубопровод. Но мое решение не работает, потому что я пытаюсь использовать метод @ stati c неправильно

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 в качестве решения, это потому, что я хочу один счет на конвейер

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

1 Ответ

0 голосов
/ 09 апреля 2020

Я нахожу решение

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) 


output

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 без указания его в параметре `pipline Class global '.

...