在python中,一般来说,“对象的属性”是什么?

时间:2019-03-12 04:24:03

标签: python attributes directory

我正在学习python,正在教的内置函数之一是dir()-课程将其描述为“返回对象的有效属性目录,” 但是对象的属性是什么?

我认为我在返回的属性列表中看到了一些成员函数,我假设是__len__指向len(),但是列出的所有这些其他内容是什么?

Course description

还有,这是什么意思,它可能是不完整的?

这是我的第一个问题,如果我还没有花费45分钟来解决这个问题,我就不会问。

3 个答案:

答案 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 的任何实例都将在其属性Txafunc中包括。对象的属性还包括其基类的所有属性(因此,它继承自哪些类),最终始终包括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)
  

“我被称为”

这些功能中的许多功能也以相同的方式工作。