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')