2013-12-17 32 views
11

Ưu điểm/nhược điểm của việc sử dụng Class() hoặc self .__ class __() để tạo một đối tượng mới trong một lớp là gì? Có một cách thường được ưu tiên hơn cách khác không?Class() so với self .__ class __() khi tạo đối tượng?

Đây là một ví dụ giả tạo về những gì tôi đang nói đến.

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)            

Trả lời

10

self.__class__ sẽ sử dụng loại lớp con nếu bạn gọi phương thức đó từ thể hiện phân lớp.

Sử dụng lớp một cách rõ ràng sẽ sử dụng bất cứ lớp học mà bạn chỉ định rõ ràng (tự nhiên)

ví dụ .:

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 

Tất nhiên, ví dụ này là khá vô dụng khác hơn là để chứng minh quan điểm của tôi. Sử dụng một classmethod ở đây sẽ tốt hơn nhiều.

+0

Ah. Điều đó có ý nghĩa. – Ben

+0

Câu trả lời hay! Nhanh quá, +1. BTW, mũ đẹp! – aIKid

+1

@aIKid - Tôi nghĩ mũ StackOverflow là một trong những điều yêu thích của tôi về thời gian Giáng sinh. Thật là buồn cười ... Mặc dù tôi không bao giờ có một thời gian khó khăn để quyết định mặc quần áo nào trong đời thực - Mũ Stack Overflow là một vấn đề hoàn toàn khác ... – mgilson

Các vấn đề liên quan