2013-12-17 9 views
11

Quali sono i vantaggi/svantaggi dell'uso di Class() o self .__ class __() per creare un nuovo oggetto all'interno di una classe? Un modo è generalmente preferito rispetto all'altro?Class() vs self .__ class __() durante la creazione dell'oggetto?

Ecco un esempio forzato di ciò di cui sto parlando.

class Foo(object):                
    def __init__(self, a):               
    self.a = a                 

    def __add__(self, other):              
    return Foo(self.a + other.a)             

    def __str__(self):                
    return str(self.a)               

    def add1(self, b):                
    return self + Foo(b)               

    def add2(self, b):                
    return self + self.__class__(b)            

risposta

10

self.__class__ utilizzerà il tipo di una sottoclasse se si chiama questo metodo da un'istanza sottoclasse.

Uso della classe esplicitamente utilizzerà qualsiasi classe esplicitamente specificati (naturalmente)

es .:

class Foo(object): 
    def create_new(self): 
     return self.__class__() 

    def create_new2(self): 
     return Foo() 

class Bar(Foo): 
    pass 

b = Bar() 
c = b.create_new() 
print type(c) # We got an instance of Bar 
d = b.create_new2() 
print type(d) # we got an instance of Foo 

Naturalmente, questo esempio è abbastanza inutile se non per dimostrare il mio punto. Usare un metodo di classe qui sarebbe molto meglio.

+0

Ah. Ciò ha senso. – Ben

+0

Ottima risposta! Anche veloce, +1. A proposito, bel cappello! – aIKid

+1

@aikid - Penso che i cappelli StackOverflow siano una delle cose che preferisco di Natale. È comunque divertente ... Non ho mai avuto difficoltà a decidere quali abiti indossare nella vita reale - I cappelli Stack Overflow sono un'altra cosa interamente ... – mgilson