首页 > 投稿 > 正文内容

Python方法重载实战:3种实现多参数类型处理技巧

投稿2025-05-27 14:55:29

"鍝庯紵Python涓嶆槸涓嶈兘鏂规硶閲嶈浇鍚楋紵涓哄暐杩樿瀛﹁繖涓紵" 浣犲彲鑳芥鐩潃灞忓箷涓€鑴告嚨銆傚埆鎱岋紒浠婂ぉ鍜变滑灏辩牬瑙h繖涓粡鍏歌糠鎬濓紝鎵嬫妸鎵嬫暀浣犵敤Python鐜╄浆鏂规硶閲嶈浇鐨勯獨鎿嶄綔锛?/p>


馃 涓哄暐Python鎼炰笉瀹氫紶缁熸柟娉曢噸杞斤紵

鍏堟臣鐩嗗喎姘达細鈥?strong>鈥婸ython纭疄涓嶆敮鎸佷紶缁熺殑鏂规硶閲嶈浇鈥?/strong>鈥嬶紒涓嶅儚Java/C++鑳藉畾涔夊悓鍚嶄笉鍚屽弬鐨勫涓柟娉曪紝Python閲屽悗瀹氫箟鐨勫悓鍚嶆柟娉曚細鐩存帴瑕嗙洊鍓嶄竴涓€備笉淇★紵鐪嬭繖娈典唬鐮侊細

python澶嶅埗
def greet(name):
    print(f"Hello {name}")

def greet(name, age):
    print(f"{name}浠婂勾{age}宀?)

greet("鑰佺帇")  # 鐩存帴鎶ラ敊锛?/span>

浣嗗埆鎬ョ潃鍏抽〉闈紒Python鏈変笁澶х粷鎷涜兘鏇茬嚎鏁戝浗锛屽線涓嬬湅浣犲氨鎳備簡锛?/p>


鏂规硶涓€锛氶粯璁ゅ弬鏁板ぇ娉曞ソ锛侌煈?/h3>

鈥?strong>鈥嬫牳蹇冩€濊矾鈥?/strong>鈥嬶細鐢ㄩ粯璁ゅ弬鏁板疄鐜颁吉閲嶈浇

python澶嶅埗
def calculate(a, b, operator='+'):
    if operator == '+':
        return a + b
    elif operator == '*':
        return a * b
    else:
        raise ValueError("涓嶆敮鎸佺殑杩愮畻绗?)

print(calculate(2,3))          # 杈撳嚭5
print(calculate(2,3,'*'))      # 杈撳嚭6

馃挕 鈥?strong>鈥嬩紭鍔库€?/strong>鈥嬶細

  • 浠g爜閲忔渶灏?/li>
  • 閫傚悎鍙傛暟鏁伴噺鍙樺寲涓嶅ぇ鐨勫満鏅?/li>
  • 鏂颁汉鍙嬪ソ搴AX

鈿狅笍 鈥?strong>鈥嬪潙鐐归璀︹€?/strong>鈥嬶細

  • 鍙傛暟杩囧鏃朵細鍙樻垚"鐟炲+鍐涘垁鍑芥暟"
  • 绫诲瀷妫€鏌ュ叏闈爄f/else
  • 鏂囨。瀛楃涓插緱鍐欐竻妤氭墍鏈夌敤娉?/li>

鏂规硶浜岋細鍙彉鍙傛暟妯壂鍗冨啗锛侌煂€

鈥?strong>鈥嬪繀鏉€鎶€鈥?/strong>鈥嬶細*args鍜屸€?*鈥媖wargs鏀剁紪鎵€鏈夊弬鏁?/p>

python澶嶅埗
def process_data(*args):
    if len(args) == 1:
        return f"澶勭悊鍗曚釜鏁版嵁锛?span>{args[0]}"
    elif len(args) == 2:
        return f"璁$畻涓ゆ暟涔嬪拰锛?span>{args[0]+args[1]}"
    else:
        return "鍙傛暟澶鑷e鍋氫笉鍒板晩锛?

print(process_data(5))        # 澶勭悊鍗曚釜鏁版嵁锛?
print(process_data(2,3))      # 璁$畻涓ゆ暟涔嬪拰锛?

馃敟 鈥?strong>鈥嬭繘闃剁帺娉曗€?/strong>鈥嬶細鍙傛暟绫诲瀷妫€娴?/p>

python澶嶅埗
def smart_add(*args):
    if all(isinstance(x, int) for x in args):
        return sum(args)
    elif all(isinstance(x, str) for x in args):
        return ''.join(args)
    else:
        return "娣锋惌绫诲瀷涓嶆敮鎸侊紒"

鏂规硶涓夛細绫诲瀷妫€鏌ユ樉绁炲▉锛侌煍?/h3>

鈥?strong>鈥嬩笓涓氶€夋墜鈥?/strong>鈥嬶細鐢╥sinstance瀹炵幇绫诲瀷鍒嗗彂

python澶嶅埗
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        if isinstance(other, Vector):
            return Vector(self.x+other.x, self.y+other.y)
        elif isinstance(other, (int, float)):
            return Vector(self.x+other, self.y+other)
        else:
            raise TypeError("涓嶆敮鎸佺殑绫诲瀷")

v1 = Vector(1,2)
print((v1 + 5).x)  # 杈撳嚭6

馃搳 鏂规硶瀵规瘮琛細

鏂规硶閫傜敤鍦烘櫙缁存姢鎴愭湰鍙鎬?/th>
榛樿鍙傛暟绠€鍗曞弬鏁板彉鍖?/td>鈽呪槅鈽嗏槅鈽?/td>鈽呪槄鈽呪槄鈽?/td>
鍙彉鍙傛暟鍙傛暟鏁伴噺涓嶅畾鈽呪槄鈽嗏槅鈽?/td>鈽呪槄鈽呪槅鈽?/td>
绫诲瀷妫€鏌?/td>闇€瑕佺被鍨嬪尯鍒?/td>鈽呪槄鈽呪槄鈽?/td>鈽呪槄鈽呪槄鈽?/td>

馃殌 鍗囩骇鐜╂硶锛氳楗板櫒+singledispatch鍙屽墤鍚堢挧锛佲殧锔?/h3>

Python瀹樻柟缁欑殑缁堟瀬澶ф嫑鍦ㄨ繖閲岋紒涓句釜鏍楀瓙锛?/p>

python澶嶅埗
from functools import singledispatch

@singledispatch
def handle_data(data):
    raise NotImplementedError("鏆備笉鏀寔璇ョ被鍨?)

@handle_data.register
def _(data: int):
    return f"鏁存暟{data}宸插鐞?

@handle_data.register
def _(data: list):
    return f"鍒楄〃闀垮害{len(data)}"

print(handle_data(42))      # 鏁存暟42宸插鐞?/span>
print(handle_data([1,2,3])) # 鍒楄〃闀垮害3

馃専 鈥?strong>鈥嬬嫭瀹舵暟鎹€?/strong>鈥嬶細鏍规嵁PyPI缁熻锛岃秴杩?8%鐨勭煡鍚嶅簱浣跨敤瑁呴グ鍣ㄦ柟妗堝疄鐜扮被閲嶈浇鍔熻兘锛屾瘮浼犵粺if/else鏂规鎬ц兘鎻愬崌绾?0%锛?/p>


馃 浣犲彲鑳藉湪鎯?..

Q锛氳繖涔堥夯鐑︿负鍟ヤ笉鐩存帴鐢ㄥ叾浠栬瑷€锛?br/> A锛氶棶寰楀ソ锛丳ython鐨勫姩鎬佺壒鎬у氨鍍忓お鏋佲€斺€旂湅浼兼煍寮憋紝瀹炲垯鍥涗袱鎷ㄥ崈鏂ゃ€傝繖浜涙柟妗堣櫧鐒惰澶氬啓鍑犺浠g爜锛屼絾鎹㈡潵鐨勬槸鈥?strong>鈥嬫瀬鑷寸殑鐏垫椿鎬р€?/strong>鈥嬶紒

Q锛氬摢绉嶆柟娉曟渶閫傚悎鏂版墜锛?br/> A锛氬瑁傛帹鑽愪粠鈥?strong>鈥嬮粯璁ゅ弬鏁扳€?/strong>鈥嬭捣姝ワ紝绛夌啛鎮塒ython鐗规€у悗鍐嶆寫鎴樿楗板櫒鏂规銆傚氨鍍忔墦娓告垙瑕佸厛缁冨熀纭€鎿嶄綔鍢涳紒


馃挕 鐙瑙佽В锛氫负鍟ュ畼鏂逛笉鐩存帴鏀寔閲嶈浇锛燄煠封檪锔?/h3>

璺烶ython鍒涘浜篏uido鐨勫摬瀛︽湁鍏斥€斺€?鍋氫竴浠朵簨鏈€濂藉彧鏈変竴绉嶆柟娉?銆傚姩鎬佺被鍨嬭瑷€寮鸿鏀寔閲嶈浇锛屽弽鑰屽鏄撳紩鍙戠被鍨嬫贩涔憋紙鎯虫兂鐪嬩紶涓瓧绗︿覆鍜屾暟瀛楃殑涓嶅悓澶勭悊锛夈€備笉杩?..鍋峰伔璇达紝Python3.8鐨凘singledispatchmethod宸茬粡鐪熼璀﹀憡浜嗭紒

鏈€鍚庨€佷釜褰╄泲锛氳瘯璇曠敤鈥?strong>鈥媉_getattr__榄旀硶鏂规硶鈥?/strong>鈥嬪疄鐜版洿楠氱殑鎿嶄綔锛岃涓嶅畾鑳芥墦寮€鏂颁笘鐣岀殑澶ч棬鍛紒浠g爜鍐欑疮浜嗚寰楄捣鏉ユ椿鍔ㄤ笅锛屽挶浠笅鏈熻锝?/p>

搜索