python父类方法的装饰器_Python装饰器:如何在子类中使用父类装饰器

参见英文答案 >

Accessing a decorator in a parent class from the child in Python                                    1个

注意:

在另一个问题上接受的答案显示了如何使用父装饰器.

此问题上接受的答案显示将装饰器移动到模块范围.

编辑:使用前面的例子是一个坏主意.希望这更清楚:

class A:

def deco( func ):

print repr(func)

def wrapper( self, *args ):

val = func( *args )

self.do_something()

return val

return wrapper

def do_something( self ):

# Do something

print 'A: Doing something generic for decoration'

@deco

def do_some_A_thing ( self ):

# Do something

print 'A: Doing something generic'

class B ( A ):

@deco

def do_some_B_thing( self ):

# Do something

print "B: Doing something specific"

a = A()

b = B()

a.do_some_A_thing()

b.do_some_B_thing()

#Expected Output:

#A: Doing something generic

#A: Doing something generic for decoration

#B: Doing something specific

#A: Doing something generic for decoration

此代码生成NameError:名称’deco’未在B内定义.

装饰器需要在类范围内,因为我需要访问存储状态.

第三编辑:关于斯文的建议,我试过这个:

class A:

def deco( func ):

def wrapper( self, *args ):

val = func( *args )

self.do_something(*args)

return val

return wrapper

def do_something( self ):

# Do something

print 'A: Doing something generic for decoration'

@deco

def do_some_A_thing ( self ):

# Do something

print 'A: Doing something generic'

deco = staticmethod(deco)

class B ( A ):

@A.deco

def do_some_B_thing( self ):

# Do something

print "B: Doing something specific"

a = A()

b = B()

a.do_some_A_thing()

b.do_some_B_thing()

#Expected Output:

#A: Doing something generic

#A: Doing something generic for decoration

#B: Doing something specific

#A: Doing something generic for decoration

我现在有TypeError:do_some_A_thing()只取1个参数(给定0).有什么指针吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值