Python descriptors and attributes

I am learning Python and I am trying to better understand descriptors. When I look at this Python online book: http://www.cafepy.com/article/python_attributes_and_methods/ch01s05.html , it says:

  • If attrname is a special (i.e. Python-provided) attribute for objectname, return it.

I do not understand what Python means. Can someone give me an example of such an attribute provided by Python that will take precedence over the usual resolution order?

Note. I'm only interested in the new style classes (since the descriptors don't even belong to the old style, as far as I know).

+5
source share
2 answers

As you might guess, step 1 is wrong and does not exist.

0
source

__class__ , for example:

 >>> class Test(object): __dict__ = {'__class__' : "dict of Test"} def __init__(self): self.__dict__['__class__'] = "dict of test" >>> test = Test() >>> test.__class__ <class '__main__.Test'> >>> test.__dict__ {'__class__': 'dict of test'} >>> Test.__dict__ dict_proxy({'__dict__': {'__class__': 'dict of test'}, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Test' objects>, '__doc__': None, '__init__': <function __init__ at 0x02BD2770>}) >>> 

equivalent in old-style classes:

 >>> class Test: pass >>> Test.__dict__["__class__"] = "spam" >>> test = Test() >>> test.__class__ <class __main__.Test at 0x02BD1110> >>> test.__dict__ = {'__class__': "foo"} >>> test.__class__ <class __main__.Test at 0x02BD1110> 

but

 >>> test.__dict__ = {'__lolcat__': "bar"} >>> test.__lolcat__ 'bar' 

Depending on the type of object, there are many more special attribute names. For example, functions:

 >>> def test():pass >>> dir(test) ['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name'] >>> test.func_closure >>> test.__dict__['func_closure']='roflcopter' >>> test.func_closure >>> test.__dict__['foo']='bar' >>> test.foo 'bar' 

see http://docs.python.org/reference/datamodel.html for a review

+1
source

All Articles