比方说,我需要调用一个方法或更改类的一个属性,但我并不确切地知道它将是哪一个。现在,我的代码看起来像这样:
def change(obj, attr_name, val):
attr = getattr(obj, attr_name, None)
# check if attr exists
if type(attr) == 'NoneType':
print('no such attribute')
return
if callable(attr):
attr(val)
else:
setattr(obj, attr_name, val)
然而,在我看来,它并不是很优雅。我用谷歌搜索了几天也没找到答案。
我用它来调用一个对象的方法,这个对象的名字我事先不知道。我从阅读python文献中了解到,在这种情况下使用getattr是有效的。然而,后来我开始用@property
修饰我的一些方法,当我尝试用getattr(obj, attr_name)(value)
调用它们时,我得到了一个错误。下面是用来说明我的问题的代码片段:
class myclass1:
def __init__(self):
self._a = 'hello'
def getA(self):
return self._a
def setA(self, val):
self._a = val
class myclass2:
def __init__(self):
self._a = 'hello'
@property
def A(self):
return self._a
@A.setter
def A(self, val):
self._a = val
def changeOLD(obj, attr_name, val):
attr = getattr(obj, attr_name, None)(val)
obj1 = myclass1()
obj2 = myclass2()
changeOLD(obj1, 'setA', 'goodbye')
print(obj1.getA())
changeOLD(obj2, 'A', 'goodbye')
print(obj2.A)
当我运行它时:
$ python test.py
goodbye
Traceback (most recent call last):
File "test.py", line 45, in <module>
changeOLD(obj2, 'A', 'goodbye')
File "test.py", line 37, in changeOLD
attr = getattr(obj, attr_name, None)(val)
TypeError: 'str' object is not callable
所以我想我需要一种方法来区分属性和方法。
发布于 2020-12-06 09:35:54
您为所描述的用例提供的代码没有重大问题。不过,您可以做一些更改。
我会更改,这样您就可以检查None
而不是None
的类型。而且打印通常不是在处理逻辑的方法中完成的。你可能还想从你要调用的函数中返回值。最后,将方法名称更改为更合适的名称。
def set_or_call(obj, name, value):
attr_or_function = getattr(obj, name, None)
if attr_or_function is None:
return None # Or raise an exception if this is suppose to be an error.
elif callable(attr_or_function):
return attr_or_function(value)
else:
setattr(obj, attr_or_function, value)
https://stackoverflow.com/questions/65166481
复制