Python 如何检查一个对象是否实现了
我想在对象上动态地实现Python 如何检查一个对象是否实现了,python,Python,我想在对象上动态地实现\uu\str\uu方法,如果该对象尚未实现它 我尝试使用hasattr(obj,'.\u str'.'uu')当它从对象类中获取它时,它总是返回true 有没有办法确定一个对象是否实际实现了\uu str\uu 我知道我可以使用inspect.getmembers(obj),但我正在寻找一种更具python风格的方法 编辑 class Employee(object): def __init__(self, name, age, emp_code): self.n
\uu\str\uu
方法,如果该对象尚未实现它
我尝试使用hasattr(obj,'.\u str'.'uu')
当它从对象类中获取它时,它总是返回true
有没有办法确定一个对象是否实际实现了\uu str\uu
我知道我可以使用inspect.getmembers(obj)
,但我正在寻找一种更具python风格的方法
编辑
class Employee(object):
def __init__(self, name, age, emp_code):
self.name = name
self.age = age
self.emp_code = emp_code
测试
e = Employee("A", 23, "E1")
print hasattr(e, '__str__')
>> True
我想要一个返回
False
的检查,而不是选择从对象继承的方法,因为您想要检查的是它是否有一个\uuu str\uuuu
实现,而不是默认的对象。因此,您可以这样做:
Foo.__str__ is not object.__str__
要检查实例化对象,需要检查类:
type(f).__str__ is not object.__str__
即使Foo没有直接实现\uuu str\uuuu
,而是从对象
以外的另一个类继承了它,这也会起作用,这似乎是您想要的。任何从对象
基继承的对象都会有一个\uu str\uuu
方法,因此测试它是否存在可以忽略不计
您可以在对象上存储一个标志属性,并测试该属性:
if not getattr(obj, 'has_str_override_flag'):
override_str_here(obj)
setattr(obj, 'has_str_override_flag', True)
在你的对象中有一个dict,它包含了对象所有的方法和变量。您可以检查给定对象是否具有由
'__str__' in Employee.__dict__
或
vars()和uuu dict_uuu之间没有区别,只是vars()更像python。事实证明,内置类型依赖于对象。uuu str_uuu
进行(智能)格式化。我真的只想消除无用的字符串,比如
,并且仍然正确地打印dict和其他类型的字符串。我的解决方案:
objre=re.compile(r“”)
如果objre.fullmatch(str(obj)):
#做更聪明的格式化
这不会捕获模块、函数等的默认格式,可以通过inspect.getsource()
显示源代码,但我不会在变量检查器中显示它们。使用类型(e)。\uu dict\uuu.get(方法名称)避免在使用类型(e)时,如果类中不存在方法名称,则出现KeyError
e = Employee("A", 23, "E1")
if type(e).__dict__.get('__str__'):
print('__str__ implemented')
else:
print('__str__ not implemented')
我已经尝试使用hasattr作为'str',但是它总是返回true。另一件事是,如果我使用hasattr作为'eq',它工作得很好,那么检查obj.\uu str\uuu!=对象。\uuuuu str\uuuuu
?是否希望此方法适用于任何继承的\uuuuuu str\uuuu
方法?如果该方法不是来自对象
,而是继承链上的某个其他类,该怎么办?“动态实现\uuuu str\uuu
”闻起来非常可疑。你是如何/为什么这样做的?我希望你意识到你不能把特殊的方法蒙骗到现有的对象上;Python不会检查实例的dict进行特殊方法查找。的好例子用例是
,而不是=
。编辑:OP想要的东西根本不寻找继承的方法。需要类型(f)。\uuuuu dict\uuuu[''uuuu str\uuuu']
来规避继承。嗯,邓德斯。奇怪的是,当你做f=Foo();f、 因为str(f)
不调用f.\uuuuu str_uuu()
(!)。您不能在对象上实现特殊方法。只在它们的类上使用。@Bhushan:在这种情况下,最好不要在对象上使用str(),而是创建自己的方法。
e = Employee("A", 23, "E1")
if type(e).__dict__.get('__str__'):
print('__str__ implemented')
else:
print('__str__ not implemented')