2014-04-08 16 views
11

Trong Python, việc định nghĩa một hàm với một danh sách tham số trống yêu cầu một tập hợp dấu ngoặc đơn rỗng. Tuy nhiên, việc xác định class với lớp cha mặc định không yêu cầu một bộ ngoặc đơn trống; thay vào đó, đó là tùy chọn và có vẻ không phổ biến. Tại sao nó như vậy?Tại sao dấu ngoặc đơn tùy chọn khi xác định một lớp, nhưng bắt buộc khi xác định một hàm?

Xem thêm: Python class definition syntax.

+2

Tại sao không nên như vậy? Các lớp không có chức năng. Bỏ phiếu để đóng vì tôi nghĩ rằng đây là một câu hỏi dựa trên ý kiến. Tôi nghi ngờ có một câu trả lời khách quan. –

+0

Tôi đang trên tàu mà một chức năng no-args không nên yêu cầu một bộ rỗng của niềng răng, nhưng đó là ý kiến ​​của tôi và chỉ đơn giản là không phải là cách python hoạt động. Các ngôn ngữ khác như ruby ​​có các dấu ngoặc đơn tùy chọn đến cùng cực, và nó có ... các mặt tích cực và nhược điểm. – roippi

+1

[Năm 2005] (https://mail.python.org/pipermail/python-dev/2005-February/051712.html) dấu ngoặc đơn trống không được phép. – kojiro

Trả lời

9

Tôi nghĩ câu trả lời cho câu hỏi của bạn chỉ đơn giản là cú pháp. Đó chỉ là cách Python được thiết lập, nhưng quan điểm của tôi về cách nó đã cách đó là:

Tôi nghĩ rằng chức năng bước ra khỏi những thứ toán học như:

f(x) = x 

Vì vậy, khi ngôn ngữ lập trình máy tính đã được tạo ra có vẻ như đã có một số liên tục hợp lý từ toán học tương tự thành các ngôn ngữ lập trình.

Mặt khác, các cấu trúc khác của Khoa học Máy tính và quản lý bộ nhớ lặp lại, vì vậy chúng không được tạo theo cách như vậy, nhưng chúng có chất lượng chức năng cho chúng.

Đối với Python, tôi sẽ sử dụng thuật ngữ method cho function như đó là biệt ngữ thông thường ...

Tôi hiểu lý lẽ của bạn mà cả một classmethod nên cho phép được xác định bằng cách sử dụng ngắn cắt ở trường hợp không có đối số:

  • cho class es khi không có thừa kế
  • cho method s khi không có đối số

Một lý do tôi có thể nghĩ là tính nhất quán trong việc sử dụng và định nghĩa. Chúng ta hãy xem xét một số ví dụ:

định nghĩa:

def funcA(): 
    return 0 

def funcB(arg): 
    return arg 

và bạn muốn gọi funciton rằng:

>>> funcA() 
>>> functB("an argument") 

>>> f1 = funcA 
>>> f2 = funcB 
>>> f1() 
>>> f2("another argument") 

để vượt qua tài liệu tham khảo và gọi cho họ.

Cú pháp của dấu ngoặc đơn giữa tuyên bố method nhất quán với việc gọi số methods.

Bạn cần đặt dấu ngoặc đơn trống nếu không thông dịch viên sẽ cung cấp cho bạn tham chiếu đến method và không thực sự gọi nó.

Vì vậy, một lợi ích là nó làm cho mã của bạn rất rõ ràng.

định nghĩa:

class classA: 
    pass 

class classB(object): 
    pass 

sử dụng:

# create an instance 
my_instance_of_A = classA() 
my_instance_of_B = classB() 

# pass a reference 
my_ref_to_A = classA 
my_ref_to_B = classB 

# call by reference 
new_A = my_ref_to_A() 
new_B = my_ref_to_B() 

Ở đây không có sự thay đổi trong hành vi liên quan đến liệu class kế thừa hay không, hành vi gọi của nó được quyết định bởi những gì nó nội bộ hoặc được thừa kế Phương pháp __init__ được định nghĩa là.

Tôi nghĩ thiết lập hiện tại yêu cầu trống () làm cho mã dễ đọc hơn đối với mắt chưa được đào tạo.

Nếu bạn thực sự thực sự thực sự muốn làm những gì bạn yêu cầu, có một cách giải quyết ... bạn luôn có thể làm điều này:

func = lambda: "im a function declared with no arguments, and I didn't use parenthesis =p" 

mà có thể được gọi là:

>>> func 
<function <lambda> at 0x6ffffef26e0> 
>>> func() 
"im a function declared with no arguments, and I didn't use parenthesis =p" 

Nhưng python holy book says No

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