2013-12-17 4 views
11

Каковы преимущества/недостатки использования класса Class() или self .__ __() для создания нового объекта внутри класса? Один из способов, как правило, предпочтительнее другого?Класс() vs self .__ класс __() при создании объекта?

Вот надуманный пример того, о чем я говорю.

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)            

ответ

10

self.__class__ будет использовать тип подкласса, если вызвать этот метод из подкласса экземпляра.

Используя класс явно будет использовать любой класс, который вы явно указать (естественно)

.: например

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 

Конечно, этот пример довольно бесполезно, кроме как продемонстрировать свою точку зрения. Использование classmethod здесь было бы намного лучше.

+0

Ах. В этом есть смысл. – Ben

+0

Отличный ответ! Быстрый тоже +1. Кстати, милая шляпа! – aIKid

+1

@aIKid - Я думаю, что шляпы StackOverflow - одна из моих любимых вещей о Рождестве. Это как-то забавно, хотя ... Мне никогда не трудно решить, какую одежду носить в реальной жизни - шляпы с переполнением стека - это совсем другое дело ... – mgilson

Смежные вопросы