2015-10-15 7 views
5

Kurzer Kontext: Ich versuche, die Standardargumente einer Klasse zu ihrer __new__ Methode zu bearbeiten. Ich brauche Zugriff auf die Methode, und ich habe versucht, Zugriff auf die gleiche Weise zu erhalten, wie ich auf seine anderen Methoden zugegriffen habe - durch seine __dict__.Warum ist die __new__ Methode einer Klasse nicht in ihrem __dict__?

Aber hier können wir sehen, dass seine __new__ Methode ist nicht in seiner __dict__.

Ist das mit __new__ eine statische Methode? Wenn ja, warum sind diese nicht in der Klasse __dict__? Wo sind sie im Objektmodell gespeichert?

class A(object): 
    def __new__(cls, a): 
     print(a) 
     return object.__new__(cls) 
    def f(a): 
     print(a) 
    ....:   

In [12]: A.__dict__['f'] 
Out[12]: <function __main__.A.f> 

In [13]: A.__dict__['__new__'] 
Out[13]: <staticmethod at 0x103a6a128> 

In [14]: A.__new__ 
Out[14]: <function __main__.A.__new__> 

In [16]: A.__dict__['__new__'] == A.__new__ 
Out[16]: False 

In [17]: A.__dict__['f'] == A.f 
Out[17]: True 
+2

I‘ Ich bin mir nicht sicher, was Sie fragen. Warum denkst du 'A .__ dict __ ['__ new __']' ist 'object .__ new__'? – chepner

+0

Guter Punkt. Ich habe die Frage bearbeitet. Die allgemeine Frage bleibt: Ich habe auch ein paar Zeilen Code hinzugefügt, die zeigen, dass sein '__new__' anders behandelt wird als seine' f' Methode – Maximilian

+0

Das ist Python 3, richtig? – chepner

Antwort

2

A.__dict__['new'] ist der static Deskriptor, wo, wie A.__new__ ist die tatsächliche Funktion verknüpft.

https://docs.python.org/2/howto/descriptor.html#static-methods-and-class-methods

wenn Sie die Funktion aufrufen müssen, oder sie erhalten, indem eine Zeichenfolge (zur Laufzeit) arbeiten, verwenden getattr(A, '__new__')

>>> A.__new__ 
<function A.__new__ at 0x02E69618> 
>>> getattr(A, '__new__') 
<function A.__new__ at 0x02E69618> 

Python 3.5.1

class A(object): 
def __new__(cls, a): 
    print(a) 
    return object.__new__(cls) 
def f(a): 
    print(a) 

>>> A.__dict__['__new__'] 
<staticmethod object at 0x02E66B70> 
>>> A.__new__ 
<function A.__new__ at 0x02E69618> 
>>> object.__new__ 
<built-in method __new__ of type object at 0x64EC98E8> 
>>> A.__new__(A, 'hello') 
hello 
<__main__.A object at 0x02E73BF0> 
>>> A.__dict__['__new__'](A, 'hello') 
Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
TypeError: 'staticmethod' object is not callable 
>>> getattr(A, '__new__') 
<function A.__new__ at 0x02E69618> 
Verwandte Themen