2016-09-23 4 views
1

Ich weiß, dass __new__ Methode aufgerufen wird, wenn versucht wird, eine Instanz einer Klasse zu erstellen, bevor __init__ aufgerufen wird.Ruft import Aufruf __new__ statische Methode?

Aber ich zufällig, dass zu finden, die ein Modul importieren withou Instanz erstellen wird auch anrufen __new__

Angenommen, ich habe dies:

a.py:

import abc 
class A(abc.ABCMeta): 
     def __new__(cls, name, bases, namespace): 
      print("ttt:", cls, name, bases, namespace) 
      retval = abc.ABCMeta.__new__(cls, name, bases, namespace) 
      return retval 


    class B(object): 
     __metaclass__ = A 

und

b.py

import a 

class C(B): 
    def a(): 
     pass 

Dann führe ich python b.py aus, ich kann zwei ttt Druck durch __new__ sehen. Also, wann ist die neue genau in diesem Fall genannt, schaffe ich nie eine Instanz der drei Klassen definiert i

+0

Randbemerkung: '__new__' ist keine statische Methode. Es ist der Konstruktor, der sich implizit wie eine Klassenmethode verhält (er empfängt die Klasse als erstes Argument, keine Instanz der Klasse), aber er ist nicht statisch; Statisch würde bedeuten, dass es nur von der Klasse benannt wurde und nicht anderweitig damit verbunden ist. – ShadowRanger

Antwort

2

Wenn Sie eine Metaklasse verwenden, um eine Klasse zu definieren, die Metaklasse implizit „genannt“ ist (die ruft __new__ auf, da die Metaklasse hier eine tatsächliche Klasse ist), siehe Invoking the metaclass. Ich kann nicht sagen, warum Sie drei Drucke hier sehen (Sie haben nur zwei Klassen, die A als Metaklasse verwendet, direkt oder indirekt durch Vererbung), aber das erklärt zwei der print s.

+0

Entschuldigung für Fehler, ich habe zwei Drucke, eine für B, für C – demonguy

+0

@demonguy: Nun, Sie haben nicht genau die Definition von 'C' vermittelt (' Klasse (C): 'ist ungültige Syntax); Wenn es auch darum geht, 'A' als Metaklasse zu verwenden, würde das erklären. – ShadowRanger

+0

ja, du hast Recht, es ist 'Klasse C (B):'. Entschuldigung für typo.lol – demonguy

Verwandte Themen