Làm cách nào tôi có thể khai báo một vài phương thức có cùng tên, nhưng với số lượng tham số hoặc loại khác nhau khác nhau trong một lớp?
Tôi phải thay đổi điều gì trong lớp sau?
class MyClass:
""""""
#----------------------------------------------------------------------
def __init__[self]:
"""Constructor"""
def my_method[self,parameter_A_that_Must_Be_String]:
print parameter_A_that_Must_Be_String
def my_method[self,parameter_A_that_Must_Be_String,parameter_B_that_Must_Be_String]:
print parameter_A_that_Must_Be_String
print parameter_B_that_Must_Be_String
def my_method[self,parameter_A_that_Must_Be_String,parameter_A_that_Must_Be_Int]:
print parameter_A_that_Must_Be_String * parameter_A_that_Must_Be_Int
hỏi ngày 22 tháng 2 năm 2011 lúc 14:48Feb 22, 2011 at 14:48
user278618user278618user278618
18.6K42 Huy hiệu vàng124 Huy hiệu bạc195 Huy hiệu đồng42 gold badges124 silver badges195 bronze badges
4
Bạn có thể có một chức năng có một số lượng đối số khác nhau.
def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
Vì vậy, bạn có thể sửa đổi chức năng của mình như sau:
def my_method[*args]:
if len[args] == 1 and isinstance[args[0], str]:
# Case 1
elif len[args] == 2 and isinstance[args[1], int]:
# Case 2
elif len[args] == 2 and isinstance[args[1], str]:
# Case 3
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 14:59Feb 22, 2011 at 14:59
2
Bạn không thể. Không có quá tải hoặc đa biến hoặc những thứ tương tự. Một cái tên đề cập đến một điều. Dù sao thì ngôn ngữ vẫn có liên quan, bạn luôn có thể tự mô phỏng chúng ... bạn có thể kiểm tra các loại bằng
def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
2 [nhưng xin vui lòng thực hiện đúng - ví dụ: trong Python 2, sử dụng def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
3 để phát hiện cả chuỗi và unicode], nhưng nó xấu xí, nhưng nó xấu Nói chung là nản lòng và hiếm khi hữu ích. Nếu các phương pháp làm những việc khác nhau, hãy cho chúng các tên khác nhau. Xem xét đa hình là tốt.Đã trả lời ngày 22 tháng 2 năm 2011 lúc 14:51Feb 22, 2011 at 14:51
3
Sử dụng Python 3.5 trở lên, bạn có thể sử dụng
def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
4 để cung cấp các chú thích loại cho các chức năng/phương thức quá tải.Từ các tài liệu:
@overload
def process[response: None] -> None:
...
@overload
def process[response: int] -> tuple[int, str]:
...
@overload
def process[response: bytes] -> str:
...
def process[response]:
Đã trả lời ngày 22 tháng 6 năm 2021 lúc 8:23Jun 22, 2021 at 8:23
Mark McDonaldmark McDonaldMark McDonald
7.3716 Huy hiệu vàng46 Huy hiệu bạc52 Huy hiệu Đồng6 gold badges46 silver badges52 bronze badges
Câu trả lời ngắn gọn: Bạn không thể [xem cuộc thảo luận trước đây]. Thông thường, bạn sẽ sử dụng một cái gì đó như [bạn có thể thêm nhiều loại kiểm tra và sắp xếp lại]:
def my_method[self,parameter_A, parameter_B=None]:
if isinstance[parameter_B, int]:
print parameter_A * parameter_B
else:
print parameter_A
if parameter_B is not None:
print parameter_B
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 14:54Feb 22, 2011 at 14:54
STEVEMCSTEVEMCSteveMc
1.3768 huy hiệu bạc11 huy hiệu đồng8 silver badges11 bronze badges
Bạn có thể dùng thử đa điểm trong Python:
//www.artima.com/weblogs/viewpost.jsp?thread=101605
Nhưng tôi không tin Multimethod là một cách để đi. Thay vào đó là các đối tượng mà bạn chuyển sang một phương thức nên có giao diện chung. Bạn đang cố gắng đạt được quá tải phương pháp tương tự như phương pháp trong C ++, nhưng nó rất hiếm khi được yêu cầu trong Python. Một cách để làm điều này là một tầng
def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
5 sử dụng def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
2, nhưng đó là xấu xí.
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 14:50Feb 22, 2011 at 14:50
Gruszczygruszczygruszczy
39,8K29 Huy hiệu vàng126 Huy hiệu bạc177 Huy hiệu đồng29 gold badges126 silver badges177 bronze badges
1
Python không có gì giống Java.
Không thực sự có loại, chỉ là đối tượng với các phương thức.
Có một cách để kiểm tra nếu một đối tượng được truyền qua một lớp, nhưng nó chủ yếu là thực hành xấu.
Tuy nhiên, mã bạn muốn sản xuất cho hai phương pháp đầu tiên sẽ giống như
class MyClass[object]:
def my_method[self, str1, str2=None]:
print str1
if str2: print str2
Đối với thứ ba, ... sử dụng một tên khác ...
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 14:53Feb 22, 2011 at 14:53
MRIPARDMRIPARDmripard
2.2282 Huy hiệu vàng14 Huy hiệu bạc11 Huy hiệu đồng2 gold badges14 silver badges11 bronze badges
1
Điều này không thể hoạt động. Cho dù bạn có bao nhiêu đối số, tên
def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
7 sẽ được ghi đè với phương thức def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
7 thứ hai.class C:
def m[self]:
print['m first']
def m[self, x]:
print[f'm second {x}']
ci=C[];
#ci.m[] # will not work TypeError: m[] missing 1 required positional argument: 'x'
ci.m[1] # works
Đầu ra sẽ đơn giản là:
m second 1
Đã trả lời ngày 5 tháng 6 năm 2019 lúc 11:10Jun 5, 2019 at 11:10
tuyến tiền liệtprosti
38.3k11 Huy hiệu vàng171 Huy hiệu bạc146 Huy hiệu đồng11 gold badges171 silver badges146 bronze badges
Bạn có thể muốn một mẫu tương tự như sau: Lưu ý rằng việc thêm '_' vào đầu tên phương thức là quy ước để đánh dấu một phương thức riêng tư.
class MyClass:
""""""
#----------------------------------------------------------------------
def __init__[self]:
"""Constructor"""
def my_method[self,parameter_A_that_Must_Be_String, param2=None]:
if type[param2] == str:
return self._my_method_extra_string_version[parameter_A_that_Must_Be_String, param2]
elif type[param2] == int:
return self._my_method_extra_int_version[parameter_A_that_Must_Be_String, param2]
else:
pass # use the default behavior in this function
print parameter_A_that_Must_Be_String
def _my_method_extra_string_version[self,parameter_A_that_Must_Be_String, parameter_B_that_Must_Be_String]:
print parameter_A_that_Must_Be_String
print parameter_B_that_Must_Be_String
def _my_method_extra_int_version[self,parameter_A_that_Must_Be_String, parameter_A_that_Must_Be_Int]:
print parameter_A_that_Must_Be_String * parameter_A_that_Must_Be_Int
Đã trả lời ngày 22 tháng 2 năm 2011 lúc 14:57Feb 22, 2011 at 14:57
Bbramebbramebbrame
17.2k9 Huy hiệu vàng35 Huy hiệu bạc52 Huy hiệu Đồng9 gold badges35 silver badges52 bronze badges
1
class MyClass:
def __init__[this, foo_str, bar_int]:
this.__foo = foo_str
this.__bar = bar_int
def foo[this, new=None]:
if new != None:
try:
this.__foo = str[new]
except ValueError:
print["Illegal value. foo unchanged."]
return this.__foo
def bar[this, new=None]:
if new != None:
try:
this.__bar = int[new]
except ValueError:
print["Illegal value. bar unchanged."]
return this.__bar
obj = MyClass["test", 42]
print[obj.foo[], obj.bar[]]
print[obj.foo["tset"], obj.bar[24]]
print[obj.foo[42], obj.bar["test"]]
Output:
test 42
tset 24
Illegal value. bar unchanged.
42 24
Đã trả lời ngày 25 tháng 10 năm 2012 lúc 20:33Oct 25, 2012 at 20:33
Sudokodesudokodesudokode
811 Huy hiệu bạc1 Huy hiệu đồng1 silver badge1 bronze badge
1
Tôi nghĩ rằng một ví dụ rất đơn giản bị thiếu trong tất cả các câu trả lời, và đó là: phải làm gì khi sự khác biệt duy nhất giữa các biến thể trên phương thức là số lượng đối số. Câu trả lời vẫn là sử dụng một phương thức với số lượng đối số thay đổi.
Giả sử, bạn bắt đầu với một phương pháp yêu cầu sử dụng hai đối số
def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
0Sau đó, bạn cần thêm một biến thể chỉ với đối số thứ hai [giả sử, vì số nguyên là dự phòng], giải pháp rất đơn giản:
def my_method[*args, **kwds]:
# Do something
# When you call the method
my_method[a1, a2, k1=a3, k2=a4]
# You get:
args = [a1, a2]
kwds = {'k1':a3, 'k2':a4}
1Điều tốt đẹp về giải pháp này là bất kể mã cuộc gọi sẽ sử dụng các đối số từ khóa hoặc đối số vị trí trước đó, nó vẫn sẽ tiếp tục hoạt động.
Đã trả lời ngày 1 tháng 12 năm 2015 lúc 1:08Dec 1, 2015 at 1:08
Hubert Kariohubert KarioHubert Kario
20.4K3 Huy hiệu vàng24 Huy hiệu bạc43 Huy hiệu đồng3 gold badges24 silver badges43 bronze badges