gpt4 book ai didi

python - 结合python中2个类的函数

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:23 27 4
gpt4 key购买 nike

我有以下代码:

import time

class output_letter():

def output_a(self):
print('a')
def output_b(self):
print('b')
def output_c(self):
print('c')
.............
def output_z(self):
print('z')
class wait_time():

def sleep_2(self):
time.sleep(2)

out = output_letter()
out.output_a()

我想将类 wait_time.sleep_2 的功能添加到类 output_letter 的开头。例如,如果我要创建一个假设的类“组合”,我可以这样做

c=combined()
c.output_a # would wait 2 seconds and then print 'a'

问题是我不想重写'output_letter'的所有功能,我只想为它的所有功能添加相同的功能。

我不清楚如何做到这一点,或者这是否可以通过继承或组合实现。

最佳答案

我看到您可能希望如何根据 DRY 和 SOLID 原则解决 2 个独立的任务:

  1. 将来在许多其他地方应用wait_time应该真的很容易
  2. output_letter 尽可能保持干净和不可触碰会很酷

这是我的想法:

1。创建一个模块,允许您为所有方法应用装饰器:

def for_all_methods(decorator):
def decorate(cls):
for attr in cls.__dict__:
if callable(getattr(cls, attr)):
setattr(cls, attr, decorator(getattr(cls, attr)))
return cls
return decorate

2。也将 wait_time 隔离在一个模块中:

from time import sleep

class wait_time():
@staticmethod
def sleep_decorator(function):
def wrapper(*args, **kwargs):
#sleep(2)
print("sleeping")
return function(*args, **kwargs)
return wrapper

3。这就是你如何使用它

@for_all_methods(wait_time.sleep_decorator)
class output_letter():

def output_a(self):
print('a')

def output_b(self):
print('b')

def output_c(self):
print('c')

def output_z(self):
print('z')

所以好处是,我们实际上并没有触及构造函数或更改继承。我们所做的只是在类之上添加了一个装饰器,必要时很容易启用或禁用。

如果你想走得更远,避免直接处理原始类,你可以创建一个继承自原始类的 combined 子类,并在其定义之上添加装饰器签名。

你可以试试这个 DEMO

关于python - 结合python中2个类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48016665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com