2012-05-10 22 views
5

Uczę się Pythona i staram się lepiej zrozumieć deskryptory. Kiedy patrzę na tej książki online, Python: http://www.cafepy.com/article/python_attributes_and_methods/ch01s05.html, to mówi:Deskryptory i atrybuty dostarczone przez Pythona

  1. Jeśli attrname jest specjalny (tj Pythona przewidziano) atrybut dla ObjectName, zwraca go.

Nie rozumiem, co oznacza Python. Czy ktoś może mi podać przykład takiego dostarczonego przez Pythona atrybutu, który miałby pierwszeństwo przed zwykłą kolejnością rozstrzygania?

Uwaga: interesują mnie wyłącznie zajęcia w nowym stylu (ponieważ deskryptory nie odnoszą się nawet do stylu starego, o ile wiem).

Odpowiedz

0

Jak się domyślacie, krok 1 jest płaska-out źle i nie istnieje.

1

__class__, na przykład:

>>> 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>}) 
>>> 

równowartość w starym stylu-klasy:

>>> 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> 

podczas

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

Istnieje wiele specjalne nazwy atrybutów, w zależności od typ obiektu. Na przykład, funkcje:

>>> 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' 

patrz http://docs.python.org/reference/datamodel.html na przegląd

+0

Nie zdawałem sobie z tego sprawy wcześniej, ale bezpośrednia modyfikacja '__dict__' klasy nie wydaje się działać z klasami nowego stylu - powoduje to, że obiekt" TypeError: "dict_proxy" nie obsługuje przypisania elementu ". Nadal możesz zobaczyć powyższe zachowanie w pythonie 3, modyfikując '__dict__' instancji, tj.' Test .__ dict __ ["__ class__"] = "spam" '. Czy wiesz, jakie inne atrybuty działają w ten sposób? Jedynym innym, który znalazłem, jest sam "__dict__". – James

+0

@James zobacz aktualizację – ch3ka

+0

Moje pytanie dotyczyło zajęć w nowym stylu, które pokazują tylko prace w starym stylu. – Flavien