You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:03:29