gpt4 book ai didi

python - setattr 和 getattr 方法

转载 作者:太空狗 更新时间:2023-10-30 00:39:38 25 4
gpt4 key购买 nike

我有一个锅炉板类,将一些操作委托(delegate)给引用类。它看起来像这样:

class MyClass():

def __init__(self, someClass):
self.refClass = someClass

def action1(self):
self.refClass.action1()

def action2(self):
self.refClass.action2()

def action3(self):
self.refClass.action3()

这是 refClass:

class RefClass():

def __init__(self):
self.myClass = MyClass(self)

def action1(self):
#Stuff to execute action1

def action2(self):
#Stuff to execute action2

def action3(self):
#Stuff to execute action3

我想使用 Python 元编程来使它更优雅和可读,但我不确定如何做。

我听说过 setattrgetattr ,我想我可以做类似的事情

class MyClass():

def __init__(self, someClass):
self.refClass = someClass

for action in ['action1', 'action2', 'action3']:
def _delegate(self):
getattr(self.refClass, action)()

然后我知道我需要从某个地方做这件事,我想:

MyClass.setattr(action, delegate)

我就是不能完全理解这个概念。我了解关于不重复代码以及使用函数式编程使用 for 循环生成方法的基础知识,但我不知道如何从其他地方调用这些方法。嘿嘿!

最佳答案

Python 已经包含了对包含类的广义委托(delegate)的支持。只需将 MyClass 的定义更改为:

class MyClass:

def __init__(self, someClass):
self.refClass = someClass # Note: You call this someClass, but it's actually some object, not some class in your example

def __getattr__(self, name):
return getattr(self.refClass, name)

定义时,__getattr__任何时候在实例本身上找不到属性时,都会使用访问属性的名称在实例上调用。然后通过调用 getattr 委托(delegate)给包含的对象查找包含对象的属性并返回它。每次进行动态查找都会花费一点点,所以如果你想避免它,你可以在 __getattr__ 第一次请求属性时延迟缓存它们,因此后续访问是直接的:

def __getattr__(self, name):
attr = getattr(self.refClass, name)
setattr(self, name, attr)
return attr

关于python - setattr 和 getattr 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32828305/

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