在python中既没有属性也没有方法的对象

时间:2017-04-17 07:30:09

标签: python

  

' python中的每件事都是一个对象'

那么,是否所有对象都必须具有属性和方法?

我在教程网站上阅读下面的状态,你能举例说明python中既没有属性也没有方法的预定义对象?

  

某些对象既没有属性也没有方法

2 个答案:

答案 0 :(得分:1)

Python中的所有东西确实是一个对象,这是真的。甚至类本身也被认为是对象,它们确实是内置类type的产物,这也不是一个令人惊讶的对象。但是在大多数情况下,对象几乎肯定会继承属性,包括方法或数据。

  

那么,是否所有对象都必须具有属性和方法?

不一定所有对象都有自己的属性。例如,一个对象可以从其类及其类的超类继承该属性,但该属性或方法并不一定存在于实例的命名空间字典中。事实上,实例'名称空间可以是空的,如下所示:

class Foo: 
    pass 

a = A()
print(a.__dict__) 

a除了从其类继承的属性之外,没有任何属性,所以如果你通过内置属性__dict__检查它的命名空间,你会发现命名空间是一个空字典。但您可能想知道a.__dict__的属性是不是a?区分类级属性 - 从类或其超类继承的属性和 instance-attributes - 属于实例的属性,通常存在于其名称空间中__dict__

  

你能举例说明python中既没有属性也没有方法的预定义对象?

如果您的预定义对象是内置对象,我无法想象这样的场景。同样,即使对象本身没有属性,如果在大多数情况下存在任何超类,也会有从其类继承的属性或类的超类。也许我在这里猜测,教程要求你创建一个不为其对象赋予任何属性的类,就像我上面包含的代码一样。

这已经更好地回答了您的问题:Is everything an object in python like ruby?

答案 1 :(得分:1)

有一种模仿没有属性的Python对象的hackish方法。

class NoAttr(object):
    def __getattribute__(self, attr):
        raise AttributeError("no attribute: %s" % attr)

    def __setattr__(self, attr, value):
        raise AttributeError("can't set attribute: %s" % attr)

    def __delattr__(self, attr):
        raise AttributeError("no attribute: %s" % attr)

a = NoAttr()

对于纯Python中的所有意图和目的,此实例a的行为类似于没有属性的对象(您可以在其上尝试hasattr)。

通过在C中实现一种病态阻止Python对象实现工作的类型,可能有一种在C扩展中执行此操作的低级方法。无论如何,这里的边距太小而不能写一个。

没有属性的预定义对象会破坏预定义的目的。