11

__str__如果对象尚未实现,我想在对象上动态实现方法。

我尝试使用hasattr(obj, '__str__')它总是返回真,因为它从对象类中获取它。

有没有办法确定一个对象是否真的实现了__str__

我知道我可以使用inspect.getmembers(obj),但我正在寻找一种更 Pythonic 的方式

编辑

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而不是选择继承自object.

4

5 回答 5

15

因为您要检查的是它是否有一个不是default的__str__实现。因此,您可以这样做:object.__str__

Foo.__str__ is not object.__str__

要检查实例化对象,您需要检查类:

type(f).__str__ is not object.__str__

即使 Foo 不__str__直接实现,而是从另一个类比继承它,这也将起作用object,这似乎是你想要的。

于 2013-10-28T06:44:03.753 回答
0

任何从基类继承的对象object都会有一个__str__方法,因此测试它是否存在可以忽略不计。

您可以在对象上存储标志属性,然后对其进行测试:

if not getattr(obj, 'has_str_override_flag'):
    override_str_here(obj)
    setattr(obj, 'has_str_override_flag', True)
于 2013-10-28T06:44:13.757 回答
0

那么在你的对象中有 __dict__ 包含对象所拥有的所有方法和变量。您可以检查给定对象是否具有由实现的 __str__() 方法

'__str__' in Employee.__dict__

或者

'__str__' in vars(Employee)

vars() 和 __dict__ 之间没有区别,只是 vars() 更 Pythonic。

于 2018-04-26T09:56:27.287 回答
0

事实证明,内置类型依赖于object.__str__进行(智能)格式化。我真的只想消除无用的字符串,例如<__main__.Foo object at 0x10299d390>并且仍然正确打印 dict 和其他类型。我的解决方案:

objre = re.compile(r"<.* object at 0x[0-9a-f]+>")
if objre.fullmatch(str(obj)):
    # Do smarter formatting

这不会捕获模块、函数等的默认格式,可以通过 显示源代码inspect.getsource(),但无论如何我都不会在变量检查器中显示它们。

于 2019-07-28T12:37:14.017 回答
0

使用 type(e).__dict__.get(method_name) 来避免 KeyError 如果在使用 type(e).__dict__[method_name] 时类中不存在 method_name

e = Employee("A", 23, "E1")
if type(e).__dict__.get('__str__'):
    print('__str__ implemented')
else:
    print('__str__ not implemented')
于 2019-10-13T07:51:59.527 回答