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 class
và method
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")
và
>>> 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
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. –
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
[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