gpt4 book ai didi

python - 动态定义类中的方法

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:11 24 4
gpt4 key购买 nike

我尝试根据对象创建期间给出的参数在类中动态定义一个函数。我尝试了一些想法(下面的代码),但它们都无效。也许这是不可能的。我想这样做是因为我会在 Monte Carlo 模拟中经常调用 _exec 方法。

我第一个失败的想法:

class Test_Class_1():
def __init__(self, a = None):
if a:
self.a = a

if hasattr(self, 'a'): #self is undefined.
def _exec(self):
print(self.a)
else:
def _exec():
print('no a')

我的第二个失败想法:

class Test_Class_2():
def __init__(self, a = None):
if a:
self.a = a

try self.a: #this is invalid syntax
def _exec(self):
print(self.a)
except:
def _exec():
print('no a')

我当然可以创建不同的类来实现这一点,但我更希望一个类具有更容易理解的代码结构(更短)。

谢谢你的想法!

最佳答案

您可以覆盖 __setattr__() 方法以根据属性 a 的值动态更新 _exec() 方法。 _exec() 的两种不同实现作为类中的方法提供,每当修改属性时都会选择合适的实现。

同时覆盖 __delattr__ 以防使用 del 删除属性。

class TestClass:
def __init__(self, a=None):
self.a = a

def _exec_a(self):
print(self.a)

def _exec_no_a(self):
print('no a')

def __setattr__(self, name, value):
# print('__setattr__():', name, value)
super().__setattr__(name, value)
if name == 'a':
if value is not None:
self._exec = self._exec_a
else:
del self.a

def __delattr__(self, name):
# print('__delattr__():', name)
super().__delattr__(name)
if name == 'a':
self._exec = self._exec_no_a

像这样使用它:

>>> x = TestClass()
>>> x.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'TestClass' object has no attribute 'a'

>>> x._exec()
no a
>>> x.a = 123
>>> x._exec()
123
>>> x.a = 'hello'
>>> x._exec()
hello

>>> x.a = None
>>> x.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'TestClass' object has no attribute 'a'
>>> x._exec()
no a
>>> x.a = 500
>>> x._exec()
500
>>> del x.a
>>> x._exec()
no a
>>> x.a = True
>>> x._exec()
True

>>> x = TestClass(a='xyz')
>>> x._exec()
xyz
>>> del x.a
>>> x._exec()
no a

关于python - 动态定义类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42948487/

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