Python如何定义接收自身类类型为参数的方法?含拷贝构造场景
Python 实现等价 Java 的类方法说明
Python 是动态类型语言,定义实例方法时无需提前声明参数类型,所有实例方法的第一个参数固定为 self 指代当前实例本身,其他参数直接声明即可,需要校验类型时可通过 isinstance 方法实现。另外 Python 不支持原生的方法重载,同名方法会被后定义的覆盖,因此需要在同一个方法内通过判断参数的数量、类型实现多态逻辑。
完整实现代码
class Point: def __init__(self, p=None): # 无参构造逻辑 if p is None: self.x = 0.0 self.y = 0.0 # 拷贝构造逻辑:传入Point实例时拷贝属性 elif isinstance(p, Point): self.x = p.x self.y = p.y else: raise TypeError("仅支持无参构造或传入Point实例拷贝构造") def setValues(self, *args): # 兼容传两个数值的逻辑 if len(args) == 2 and all(isinstance(i, (int, float)) for i in args): self.x, self.y = args # 兼容传Point实例的逻辑 elif len(args) == 1 and isinstance(args[0], Point): self.x = args[0].x self.y = args[0].y else: raise TypeError("仅支持传入两个数值,或一个Point实例") def isEqual(self, p): # 先校验类型是否匹配,避免报错 if not isinstance(p, Point): return False return self.x == p.x and self.y == p.y # 可选:重写Python内置的__eq__方法,直接用 == 运算符即可比较两个Point实例是否相等 def __eq__(self, other): return self.isEqual(other)
使用示例
# 无参构造实例 p1 = Point() p1.setValues(3.14, 2.71) # 拷贝构造实例 p2 = Point(p1) print(p2.isEqual(p1)) # 输出 True print(p2 == p1) # 输出 True,因为重写了__eq__方法 # 传入Point实例调用setValues p3 = Point() p3.setValues(p2) print(p3.x, p3.y) # 输出 3.14 2.71
补充说明
- 你原代码中
def setValues( x, y ):漏掉了第一个self参数,属于语法错误,运行会报错,所有实例方法必须将self作为第一个参数。 - 如果使用Python 3.5+支持的类型提示,可以让参数含义更清晰,比如
def isEqual(self, p: 'Point') -> bool:,其中'Point'是前向引用,因为定义方法时Point类还未完全加载完成。 - 除了在
__init__中实现拷贝构造,也可以用类方法单独实现拷贝构造逻辑,示例如下:
@classmethod def copy(cls, origin_point: 'Point') -> 'Point': new_point = cls() new_point.x = origin_point.x new_point.y = origin_point.y return new_point # 调用方式 p4 = Point.copy(p1)
内容的提问来源于stack exchange,提问作者kralvarado
相关产品推荐
相关产品推荐

