我正在学习python,正在教的内置函数之一是dir()
-课程将其描述为“返回对象的有效属性目录,” 但是对象的属性是什么?
我认为我在返回的属性列表中看到了一些成员函数,我假设是__len__
指向len()
,但是列出的所有这些其他内容是什么?
还有,这是什么意思,它可能是不完整的?
这是我的第一个问题,如果我还没有花费45分钟来解决这个问题,我就不会问。
答案 0 :(得分:0)
取决于您正在谈论的对象类型。假设有问题的对象是一个类,则该类的名称空间下的所有属性都按dir列出。包括任何方法,用户明确声明的类级别变量以及任何继承的东西。请记住,类从“对象”继承而来,“对象”提供了一堆特殊的方法
看看下面的代码是否有意义:
class A(object):
def __init__(self, a):
self.a = a
def m(self):
print("in method")
@property
def p(self):
print("in prop")
def __get__(self, obj, owner):
print("in get")
return self
def __call__(self, *args):
print("call")
如果在类A上执行dir,您将在A的名称空间下看到所有属性+从对象继承的属性,如下所示。还可以尝试使用dir(object)来查看具体的“对象”属性
['__call__',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__get__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'm',
'p']
请注意,self.a未列为self.a属于实例而不是类本身
要添加,您的对象编号为列表类型,因此列出了列表的所有属性(请参见dir(list))
答案 1 :(得分:0)
您在混淆一些事情,并且可能对一些混淆的事情感到困惑。
__len__
不是指len()
,而是len(something)
将调用__len__
的{{1}}方法。可以通过调用something
来询问具有__len__
方法的任何对象的长度。请注意,这与len(something)
有何不同,并且比something.len()
更清晰。
Python中对象的属性包括您通常认为的属性,以及其所有属性和方法名称。因此,对于此示例:
something.__len__()
class T:
def __init__(self):
self.x = 10
def afunc(self):
return 20
@property
def y(self):
return self.x
的任何实例都将在其属性T
,x
和afunc
中包括。对象的属性还包括其基类的所有属性(因此,它继承自哪些类),最终始终包括y
的属性。
关于它不完整的说明是针对没有object
函数要调用的__dir__
属性的对象。在这种情况下,dir()
函数将查看其dir()
属性(如果可用),结果它可能无法提供完整的属性列表-请注意,大多数对象并非如此
答案 2 :(得分:0)
这些是对象超类具有的方法。从此继承的任何对象都具有这些属性。现在,我认为您对__len__()
和len(something)
感到困惑。
len()
是默认情况下引入作用域的函数。它所做的只是调用位于该对象中的__len__()
函数。
假设您调用了len([1,2,3,4])
,这将调用类__len__()
中存在的List
方法,即创建此列表对象的类。
各种函数出于自己的目的使用这些dunder
方法。
这是一个例子
class Test:
def __myfunc__(self):
return "I have been called"
def testFunc(object):
return object.__myfunc__()
test = Test()
testFunc(test)
“我被称为”
这些功能中的许多功能也以相同的方式工作。