2011-12-04 24 views
5

Tôi có hai nhà xây dựng trong lớp học của tôi:Constructor chaining trong python

def __init__(self): 
    self(8) 

def __init__(self, size): 
    self.buffer = [1] * size 

Nơi tôi muốn các nhà xây dựng đầu tiên để gọi thứ hai với kích thước mặc định. Điều này có thể đạt được trong python?

+3

Bạn không có hai hàm tạo, cột thứ hai sẽ ghi đè đầu tiên. – u0b34a0f6ae

Trả lời

9

Bạn không thể xác định nhiều initializers trong Python (như được chỉ trong các ý kiến, __init__is not really a constructor), nhưng bạn có thể xác định giá trị mặc định, ví dụ:

def __init__(self, size=8): 
    self.buffer = [1] * size 

Trong đoạn mã trên, một bộ đệm kích thước 8 là được tạo theo mặc định, nhưng nếu tham số kích thước được chỉ định, thông số sẽ được sử dụng thay thế.

Ví dụ: giả sử rằng trình khởi tạo nằm trong một lớp có tên là Example. Cuộc gọi này sẽ tạo ra một thể hiện mới của lớp với một bộ đệm kích thước 8 (mặc định):

e = Example() 

Trong khi cuộc gọi này sẽ tạo ra một đối tượng mới với một bộ đệm kích thước 10:

e = Example(10) 

Ngoài ra, bạn cũng có thể gọi hàm tạo như sau:

e = Example(size=10) 
+1

'__init__' không phải là một hàm tạo, mà là một trình khởi tạo. Xem ['__init__' như một hàm tạo?] (Http://stackoverflow.com/questions/6578487/init-as-a-constructor). – Nathan

+0

Cảm ơn bạn đã chỉ ra điều đó, @Nathan. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. –

5

Không, bạn không thể quá tải phương thức bằng Python. Trong trường hợp này, bạn chỉ có thể sử dụng giá trị mặc định cho thông số size thay thế:

def __init__(self, size=8): 
    self.buffer = [1] * size 
1

có thể không theo cách này. Các lớp Python sử dụng một từ điển nội bộ để lưu trữ phương thức và thuộc tính của nó, một phương thức thứ hai có cùng tên sẽ ghi đè lên phương thức đầu tiên. Bạn có thể chỉ định giá trị mặc định cho thông số bổ sung của mình để thực hiện việc này,

def __init__(self, size = 8): 
    self.buffer = [1] * size 
Các vấn đề liên quan