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

为何Detect类未在__init__中直接声明self.anchors却可在方法中使用?

Detect类未在__init__直接声明self.anchors却能在_make_grid中使用的实现方式
  • 父类继承赋值
    如果Detect类继承了某个父类,父类的__init__方法已经完成self.anchors = anchors的赋值,子类实例会自动继承这个属性,无需在子类__init__里重复声明。示例代码:
class BaseDetector:
    def __init__(self, anchors):
        self.anchors = anchors

class Detect(BaseDetector):
    def __init__(self, anchors):
        super().__init__(anchors)  # 调用父类初始化完成赋值
    def _make_grid(self):
        print(self.anchors)  # 直接使用继承的属性
  • __init__内部间接赋值
    虽然没在__init__里直接写self.anchors = anchors,但可能调用了类内部的其他方法完成赋值。示例:
class Detect:
    def __init__(self, anchors):
        self._setup_anchors(anchors)  # 调用内部方法完成赋值
    def _setup_anchors(self, anchors):
        self.anchors = anchors
    def _make_grid(self):
        print(self.anchors)
  • 实例外部动态赋值
    在Detect类的实例创建后,外部代码直接给实例的anchors属性赋值,之后调用_make_grid时就能正常访问。示例:
detector = Detect(...)
detector.anchors = [10, 20, 30]  # 外部给实例赋值
detector._make_grid()  # 可直接使用self.anchors
  • 魔术方法动态获取
    如果类定义了__getattr__或__getattribute__魔术方法,访问self.anchors时会通过这些方法动态生成或获取值。比如用__getattr__的示例:
class Detect:
    def __init__(self, anchors):
        self._anchors = anchors  # 存储为私有属性
    def __getattr__(self, name):
        if name == 'anchors':
            return self._anchors
        raise AttributeError(f"'Detect' object has no attribute '{name}'")
    def _make_grid(self):
        print(self.anchors)  # 触发__getattr__获取值
  • @property装饰器实现属性伪装
    通过@property装饰器把方法伪装成属性,访问self.anchors时实际调用对应的方法返回值。示例:
class Detect:
    def __init__(self, anchors):
        self._anchors = anchors
    @property
    def anchors(self):
        return self._anchors
    def _make_grid(self):
        print(self.anchors)  # 实际调用@property修饰的方法

内容的提问来源于stack exchange,提问作者Alessandro Mondin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:27:27