RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 907506
Accepted
vladionair
vladionair
Asked:2020-11-17 01:13:56 +0000 UTC2020-11-17 01:13:56 +0000 UTC 2020-11-17 01:13:56 +0000 UTC

在 python 类中使用装饰器

  • 772

我需要你的帮助)在第一个示例中,当在函数中使用装饰器时,我随后可以单独使用装饰函数(calc),但在第二个示例中,我不能:/如何做到这一点???!

示例 1:

def prog(calc):
    def print_res():
        calc()
        print('print result')
    return print_res
def calc():
    print('calculate')
x = prog(calc)
x()
print()
calc()

结论:

calculate
print result

calculate

示例 2:

class A:
    def __init__(self, l = 0):
        self.l = l
    def account(calc):
        def print_res(self, n, m):
            calc(self, n, m)
            print('result =', self.l)
        return print_res
    @account
    def calc(self, n, m):
        self.l = n + m
test = A()
test.calc(1, 1)

结论:

result = 2
python-3.x
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Lecron
    2020-11-17T03:10:52Z2020-11-17T03:10:52Z

    你有一个不一致的电话。第一种情况,没有指定修饰,函数作为参数传递。在第二种情况下,它将适用于任何呼叫。另外,装饰函数写成静态的(没有自我),但这没有标记。因此,可能有几种解决方案。例如

    class A:
        def __init__(self, l = 0):
            self.l = l
        @staticmethod
        def account(calc):
            def print_res(self, n, m):
                self.calc(n, m)
                print('print result =', self.l)
            return print_res
        def calc(self, n, m):
            print('calculate')
            self.l = n + m
    x = A.account(A.calc)
    test = A()
    x(test, 1,1)
    test.calc(1, 1)
    

    这样的结论会是什么

    计算
    打印结果 = 2
    计算

    • 1
  2. vladionair
    2020-11-17T02:57:06Z2020-11-17T02:57:06Z
    class A:
        def prog(calc):
            def print_res():
                calc()
                print('print result')
            return print_res
        def calc():
            print('calculate')
        x = prog(calc)
        x()
    A.calc()
    
    • 0
  3. vladionair
    2020-11-18T19:50:03Z2020-11-18T19:50:03Z

    嗯,总的来说,这就是它的用途...... :)

    class Accountant:
    def __init__(self, a = [], b = [], c = [], n = 0, m = 0, sr = 0, sc = 0, tr = 0, tc = 0, value = 0):
        self.a = a
        self.b = b
        self.c = c
        self.n = n
        self.m = m
        self.sr = sr
        self.sc = sc
        self.tr = tr
        self.tc = tc
        self.value = value
    @staticmethod
    def account(calc):
        def print_res(self, n, m):
            self.calc(n, m)
            print()
            print('Введены данные: число строк:', self.n,',', 'число колонн:', self.m, '.')
            print()
            for i in range(self.n):
                for j in range(self.m):
                    print(self.a[i][j], end=' ')
                print()
            print()
            print('Проверьте правильность заполнения таблицы!')
            print()
            if self.tr == self.tc:
                print('Сумма строк:', self.tr, '.', 'Суммы строк:', self.b, '.')
                print()
                print('Сумма столбцов:', self.tc, '.', 'Суммы столбцов:', self.c, '.')
                print()
                print('Баланс сведен.')
                print()
            else:
                print('В расчетах ошибка!')
        return print_res
    def calc(self, n, m):
        self.n = n
        self.m = m
        def creat_array():
            import random
            for i in range(n):
                self.a.append([])
                for j in range(m):
                    self.value = random.randint(-10, 10)
                    self.a[i].append(self.value)
        def sum_row():
            for i in range(n):
                for j in range(m):
                    self.sr += self.a[i][j]
                    self.tr += self.a[i][j]
                self.b.append(self.sr)
                self.sr = 0
        def sum_col():
            for i in range(m):
                for j in range(n):
                    self.sc += self.a[j][i]
                    self.tc += self.a[j][i]
                self.c.append(self.sc)
                self.sc = 0
        creat_array()
        sum_row()
        sum_col()
    check = Accountant()
    x = Accountant.account(Accountant.calc)
    
    #x(check, int(input('Введите значение n:')), int(input('Введите значение m:')))
    #check.calc(int(input('Введите значение n:')), int(input('Введите значение m:')))
    
    import unittest, random
    class Test_Account(unittest.TestCase):
        def test_random(self):
            Accountant.account(Accountant.calc(check, random.randint(0, 10), random.randint(0, 10)))
            self.assertEqual(Accountant().tr, Accountant().tc)
        def test_zero(self):
            Accountant.account(Accountant.calc(check, 0, 0))
            self.assertEqual(Accountant().tr, Accountant().tc)
        def test_max(self):
            Accountant.account(Accountant.calc(check, 10, 10))
            self.assertEqual(Accountant().tr, Accountant().tc)
        def test_regr(self):
            Accountant.account(Accountant.calc(check, 5, 5))
            self.assertEqual(Accountant().tr, Accountant().tc)
        def tearDownClass():
            Accountant.account(Accountant.calc(check, 0, 0))
    if __name__ == '__main__':
        unittest.main(verbosity=2) 
    
    • 0

相关问题

  • 使用 vk api,qthread (PyQt5)

  • 如何将元组(带字符串)变成一个字符串并在其中交换单词

  • Python 重用输入

  • PyQt5 缺少参数错误

  • 将参数列表传递给类构造函数

  • 循环跟踪的迭代

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5