为何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
相关产品推荐
相关产品推荐

