我正在尝试创建对象代理。属性/属性查找可以通过简单地实现__getattribute__
、__setattr__
和__delattr__
方法来完成。但是,其他功能(如len(x), x[], bool(x)
)需要其他dunder方法(如__len__, __getitem__, __bool__
)来实现。如果你没有在代理类上实现这些,但是你代理的对象支持它们,你的代理将是不完整的,并导致运行时错误。
因此,我想有一个我需要实现的所有事情的综合清单,但我在网上找不到任何可靠的清单。
下面是我从typing
和builtins
模块中获得的97个唯一的dunder方法名。我知道他们中的很多人是做什么的,但有一些我不知道。为我的代理类实现全部或大部分将是一件痛苦的事情,所以如果有一个解决方案,我会很高兴。
__abs__
__add__
__aenter__
__aexit__
__aiter__
__and__
__anext__
__await__
__bool__
__bytes__
__call__
__class__
__cmp__
__complex__
__contains__
__delattr__
__delete__
__delitem__
__delslice__
__dir__
__div__
__divmod__
__enter__
__eq__
__exit__
__float__
__floordiv__
__format__
__fspath__
__ge__
__get__
__getattribute__
__getitem__
__getnewargs__
__getslice__
__gt__
__hash__
__iadd__
__iand__
__import__
__imul__
__index__
__init__
__init_subclass__
__instancecheck__
__int__
__invert__
__ior__
__isub__
__iter__
__ixor__
__le__
__len__
__lshift__
__lt__
__mod__
__mul__
__ne__
__neg__
__new__
__next__
__nonzero__
__or__
__pos__
__pow__
__prepare__
__radd__
__rand__
__rdiv__
__rdivmod__
__reduce__
__reduce_ex__
__repr__
__reversed__
__rfloordiv__
__rlshift__
__rmod__
__rmul__
__ror__
__round__
__rpow__
__rrshift__
__rshift__
__rsub__
__rtruediv__
__rxor__
__set__
__setattr__
__setitem__
__setslice__
__sizeof__
__str__
__sub__
__subclasscheck__
__subclasses__
__truediv__
__xor__
1条答案
按热度按时间zfciruhq1#
要代理一个对象,你只需要实现对象拥有的dunder方法,所以在最简单的情况下,你不需要做任何特殊的事情来代理它们,而你还没有做任何事情来代理对象的其他属性。
然而,问题是dunder方法是在类上查找的,而不是在对象上查找的,因此,例如,如果示例没有
bar
属性,Foo().bar
将在返回到类之前在示例上查找bar
,Foo() + 5
将在类Foo
上查找__add__
,完全忽略示例。也就是说,如果示例确实有一个名为__add__
的示例属性,那么Foo() + 5
仍然不会使用该示例属性。因此,要代理这些dunder方法,需要在类级别而不是示例级别代理它们。
用途: