Hướng dẫn python same function name different parameters - python cùng tên hàm nhưng tham số khác nhau

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ướng dẫn python same function name different parameters - python cùng tên hàm nhưng tham số khác nhau

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

Hướng dẫn python same function name different parameters - python cùng tên hàm nhưng tham số khác nhau

Đã 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:

http://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í.

Hướng dẫn python same function name different parameters - python cùng tên hàm nhưng tham số khác nhau

Đã 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 ...

Hướng dẫn python same function name different parameters - python cùng tên hàm nhưng tham số khác nhau

Đã 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

Hướng dẫn python same function name different parameters - python cùng tên hàm nhưng tham số khác nhau

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

Hướng dẫn python same function name different parameters - python cùng tên hàm nhưng tham số khác nhau

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}
0

Sau đó, 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

Chức năng nào có nghĩa là có cùng tên nhưng các tham số khác nhau?

Hai hoặc nhiều hàm có thể có cùng tên nhưng các tham số khác nhau; Các chức năng như vậy được gọi là quá tải chức năng trong C ++. Chức năng quá tải trong tính năng C ++ được sử dụng để cải thiện khả năng đọc của mã. Nó được sử dụng để lập trình viên không phải nhớ các tên chức năng khác nhau.function overloading in c++. The function overloading in the c++ feature is used to improve the readability of the code. It is used so that the programmer does not have to remember various function names.

Các phương pháp cùng tên nhưng các đối số khác nhau được gọi là Python là gì?

Quá tải chức năng là khả năng có nhiều chức năng có cùng tên nhưng với các chữ ký/triển khai khác nhau.Khi một hàm bị quá tải FN được gọi, thời gian chạy trước tiên sẽ đánh giá các đối số/tham số được truyền đến lệnh gọi chức năng và đánh giá bằng cách này sẽ gọi phép thực hiện tương ứng. is the ability to have multiple functions with the same name but with different signatures/implementations. When an overloaded function fn is called, the runtime first evaluates the arguments/parameters passed to the function call and judging by this invokes the corresponding implementation.

Một hàm có thể có nhiều tham số python?

Các hàm Python có thể có nhiều tham số..

Bạn có thể có hai phương thức có cùng tên trong Python không?

Trong Python, không giống như các ngôn ngữ khác, bạn không thể thực hiện quá tải phương thức bằng cách sử dụng cùng một tên phương thức.Tại sao?Tất cả mọi thứ là một đối tượng trong Python, các lớp và thậm chí các phương thức.Giả sử bạn có bổ sung đối tượng, là một lớp (mọi thứ trong Python là một đối tượng, vì vậy việc bổ sung lớp cũng là một đối tượng).you cannot perform method overloading by using the same method name. Why? Everything is an object in python, classes, and even methods. Say you have an object Addition, which is a class (everything in python is an object, so the class Addition is an object too).