Python中合并类私有属性的实现及设计合理性疑问
Python合并类内部属性的合理姿势
首先揪个小错误:你代码里用+合并set是行不通的,集合不支持加法运算符,得换成union()方法或者|运算符,比如:
new_event._names = event1._names | event2._names # 或者更清晰的写法 new_event._names = event1._names.union(event2._names)
回到你的核心疑问:直接在静态方法里操作_names算不算违反设计模式?
Python里的单下划线_前缀只是代码约定,用来标识“这是类内部用的属性/方法,外部代码别随便碰”,但没有强制的访问限制。对于类自己的静态方法来说,直接访问内部属性完全合理——毕竟静态方法属于类的内部逻辑,本来就该处理这些细节。
不过如果想让代码更健壮、符合封装原则,可以做两个优化:
给
_names加个只读的@property,避免外部代码直接修改内部集合:from datetime import datetime class Event: target_time: datetime _names: set @property def names(self): # 返回集合副本,防止外部通过返回值修改内部状态 return self._names.copy()把
merge改成类方法(@classmethod),逻辑更内聚,同时别忘了处理target_time的合并(你原代码没提这个,示例取两个事件中较早的时间):@classmethod def merge(cls, event1: 'Event', event2: 'Event') -> 'Event': new_event = cls() new_event._names = event1._names.union(event2._names) # 补充target_time的合并逻辑,示例取较早的时间 new_event.target_time = min(event1.target_time, event2.target_time) return new_event
要是你用的是双下划线__names(名称修饰),那直接访问会触发名字改写,反而麻烦,但单下划线的场景下,类内部方法访问完全没问题。
总结一下:你原来的写法不算违背设计模式,但优化后代码的封装性和可维护性会更好,还能避免集合合并的语法错误。
内容的提问来源于stack exchange,提问作者unitrium
相关产品推荐
相关产品推荐

