想在类的内部定义一个只用于该类的成员方法的修饰器

想在类的内部定义一个只用于该类的成员方法的修饰器

问题描述:

想在类的内部定义一个只用于该类的成员方法的修饰器,这样写是否合理?类内部的修饰器

__print_transfer_detail

是否是成员方法?是成员方法的话,既是修饰器又是成员方法,它的参数中可以没有self吗?不是成员方法的话,它需要用@classmethod 或者@staitcmethod修饰吗?

相关代码:

import datetime


class BankUser():

    def __init__(self, money, kind):
        self.__money = money
        self.kind = kind

    def __print_transfer_detail(func):
        def inner(self, transfertype, amount):
            func(self, transfertype, amount)
            print("{}\t{}\t{:+.2f}\t{}\t{:.2f}".format(datetime.date.today(), transfertype, amount, self.kind, self.__money))
        return inner


    @__print_transfer_detail
    def transfer(self, transfertype, amount):
        self.__money += amount


user = BankUser(2000, '人民币')
user.transfer('转入', 27800)
user.transfer('消费', -99)
user.transfer('消费', -100)
user.transfer('转入', 500)
user.transfer('网转', -5000)

相关截图:

https://img1.sycdn.imooc.com//climg/64ad2c3809c2060204050089.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!1、类内部的修饰器是合理的

2、它不属于成员方法,使用对象.__print_transfer_detail会报错

https://img1.sycdn.imooc.com//climg/64ae0657093f30bc10400467.jpg

3、不使用self 也会报错,定义初始化的参数无法传到__print_transfer_detail中

https://img1.sycdn.imooc.com//climg/64ae06c5098586ed12540674.jpg

4、@classmethod 或@staitcmethod也无法单独调用该方法,只能在类中作为修饰transfer方法的装饰器

https://img1.sycdn.imooc.com//climg/64ae079509a2ddc312590525.jpg


祝学习愉快~

  • 冰心本燃 提问者 #1

    Hi 老师好,我还有点疑惑
    2、它不属于成员方法,使用对象.__print_transfer_detail会报错
    【这个报错应该是因为我把__print_transfer_detail私有化了吧?】

    3、不使用self 也会报错,定义初始化的参数无法传到__print_transfer_detail中

    【我的意思不是说在inner里面使不使用self,而是__print_transfer_detail(func)这个方法的参数列表里面没有self,__print_transfer_detail(self,func)这样写应该也不对吧?那么这个方法不是成员方法、类方法、静态方法之一吗?是一种特殊的方法?而这个修饰器内部的inner方法才是成员方法?

    2023-07-12 10:41:59
  • 好帮手慕小猿 回复 提问者 冰心本燃 #2

    同学,你好!1、是同学说的因为私有方法才报错的,但是也不能说他是成员方法,成员方法如同学说的是可以写self的,print_transfer_detail参数是不可以写self的。暂时没有找到文献确定是成员方法,但是可以确定是类中的装饰器,同学可以理解为特殊的方法。老师理解inner 也不是成员方法,因为它不能直接调用。

    祝学习愉快~


    2023-07-12 12:10:11
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师