我正在阅读python dunder方法,发现我们可以为len(object)之类的内置方法定义自己的定义
所以我创建了一个具有定义的类class
>>> class otherclass:
def __len__(self):
return 0
>>> len(otherclass())
0
>>> dir(otherclass)
['__doc__', '__len__', '__module__']
它确实打印对象的len并进一步检查,我还发现 len dunder方法在使用dir
的其他类对象中可用我想知道python如何显示dir(object)的值,因为dir(otherclass)的结果中没有 dir dunder方法
答案 0 :(得分:1)
我的意思是(python 3.6)dir(otherclass)
打印
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__len__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__']
迭代次数为__dict__
。
otherclass.__dict__ == \
mappingproxy({'__dict__': <attribute '__dict__' of 'otherclass' objects>,
'__doc__': None,
'__len__': <function __main__.otherclass.__len__>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'otherclass' objects>})
因此,它包含特定于该对象的所有方法/属性。但是,其他所有资源都来自哪里?好吧,来自超类:
object.__dict__
object.__dict__ == \
mappingproxy({'__class__': <attribute '__class__' of 'object' objects>,
'__delattr__': <slot wrapper '__delattr__' of 'object' objects>,
'__dir__': <method '__dir__' of 'object' objects>,
'__doc__': 'The most base type',
'__eq__': <slot wrapper '__eq__' of 'object' objects>,
'__format__': <method '__format__' of 'object' objects>,
'__ge__': <slot wrapper '__ge__' of 'object' objects>,
'__getattribute__': <slot wrapper '__getattribute__' of 'object' objects>,
'__gt__': <slot wrapper '__gt__' of 'object' objects>,
'__hash__': <slot wrapper '__hash__' of 'object' objects>,
'__init__': <slot wrapper '__init__' of 'object' objects>,
'__init_subclass__': <method '__init_subclass__' of 'object' objects>,
'__le__': <slot wrapper '__le__' of 'object' objects>,
'__lt__': <slot wrapper '__lt__' of 'object' objects>,
'__ne__': <slot wrapper '__ne__' of 'object' objects>,
'__new__': <function object.__new__>,
'__reduce__': <method '__reduce__' of 'object' objects>,
'__reduce_ex__': <method '__reduce_ex__' of 'object' objects>,
'__repr__': <slot wrapper '__repr__' of 'object' objects>,
'__setattr__': <slot wrapper '__setattr__' of 'object' objects>,
'__sizeof__': <method '__sizeof__' of 'object' objects>,
'__str__': <slot wrapper '__str__' of 'object' objects>,
'__subclasshook__': <method '__subclasshook__' of 'object' objects>})
因此,dir
寻找一个__dir__
方法,然后寻找__dict__
(或__slots__
),然后递归地查找该方法的解析顺序(以{{1 }})依次上课。
答案 1 :(得分:0)
答案在Python文档中:https://docs.python.org/3/library/functions.html#dir
如果该对象不提供
__dir__()
,则该函数将尽最大努力从该对象的__dict__
属性(如果已定义)及其类型对象中收集信息。
答案 2 :(得分:0)
dir
是内置函数。传递对象时,它将使用对象的__dict__
(如果已定义)及其对应的类型对象来尝试显示属性。
请注意,如果dir
已在对象中被覆盖,则内置__getattr__
可能会导致奇怪的输出。
了解更多: https://docs.python.org/3/library/functions.html#dir
发表评论: 抱歉,我没有足够的声誉来发表评论。
Python中的所有对象都隐式具有一堆特殊属性,其中之一就是__dict__
属性。在Python中,类也是对象。因此,您的otherclass
类已经有一个__dict__
。在您的代码中,尝试:
otherclass.__dict__
在输出中,您将看到一些输出与dir
调用的输出相对应。
编辑2:
就像我说的那样,类是Python中的对象。它们隐式拥有对象拥有的所有方法。试试:
object.__dict__
,您会在其中找到dir
。