0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

2重デコレータ

Last updated at Posted at 2020-01-28

動いたのでメモ。12345と出力される。

class a():

    def deco1(func):
        def in_deco1(self):
            print(1)
            func(self)
            print(5)
        return in_deco1

class b(a):

    def deco2(func):
        @a.deco1
        def in_deco2(self):
            print(2)
            func(self)
            print(4)
        return in_deco2

    @deco2
    def fun(self):
        print(3)

b().fun()

追記

こっちでも動いた。

class a():

    def deco1(func):
        def in_deco1(self):
            print(1)
            func(self)
            print(5)
        return in_deco1

class b(a):

    def deco2(func):
        def in_deco2(self):
            print(2)
            func(self)
            print(4)
        return in_deco2

    @a.deco1
    @deco2
    def fun(self):
        print(3)

b().fun()

deco2に直に@a.deco1とつけるのならハナから1つのデコレータにすればいいとちょっと思ったが、
よくよく考えてみると分割させたい処理次第ではそうとも言い切れない。
まぁシステム次第だが出来る限りアトミックにすることを意識したい。

さらに追記

2重じゃないけどデコレータが普通の関数と同じように値を返戻できたので一応メモ。
これで121と出力される。

class a(object):

    def b(func):
        def in_b(self):
            print(1)
            if func(self):
                print(2)
        return in_b
    
    @b
    def c(self):
        return True
        
    @b
    def d(self):
        return False
        
e = a()
e.c()
e.d()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?