当前位置: 首页 > wzjs >正文

高端定制网站设计公司二级域名网站查询入口

高端定制网站设计公司,二级域名网站查询入口,武汉高端网站定制设计,大庆网站优化抽象方法和实例调用方法 对比表格: 特性抽象方法 (forward)实例调用方法 (call)定义方式abc.abstractmethod 装饰器特殊方法名 __call__调用方式不能直接调用,必须通过子类实现可以直接调用对象:controller(attn, ...)实现要求必须由子类实…

抽象方法和实例调用方法

对比表格:

特性抽象方法 (forward)实例调用方法 (call)
定义方式@abc.abstractmethod 装饰器特殊方法名 __call__
调用方式不能直接调用,必须通过子类实现可以直接调用对象:controller(attn, ...)
实现要求必须由子类实现,否则无法实例化可以在基类中实现,子类可以覆盖
主要功能定义具体业务逻辑(如存储注意力)处理通用流程(如计数、步骤控制)
代码位置在子类中实现(如 AttentionStore在基类中实现(AttentionControl
使用场景需要子类提供不同实现时需要统一接口时
错误处理在类定义时检查在运行时检查
代码复用每个子类都需要实现所有子类共享基类实现

以下面代码片段为例

class AttentionControl(abc.ABC):def step_callback(self, x_t):return x_tdef between_steps(self):return@propertydef num_uncond_att_layers(self):return 0@abc.abstractmethoddef forward(self, attn, is_cross: bool, place_in_unet: str):raise NotImplementedErrordef __call__(self, attn, is_cross: bool, place_in_unet: str):if self.cur_att_layer >= self.num_uncond_att_layers:h = attn.shape[0]attn[h // 2 :] = self.forward(attn[h // 2 :], is_cross, place_in_unet)self.cur_att_layer += 1if self.cur_att_layer == self.num_att_layers + self.num_uncond_att_layers:self.cur_att_layer = 0self.cur_step += 1self.between_steps()return attndef reset(self):self.cur_step = 0self.cur_att_layer = 0def __init__(self):self.cur_step = 0self.num_att_layers = -1self.cur_att_layer = 0
  1. 抽象方法:

    • 是接口定义
    • 强制子类实现
    • 提供具体功能
  2. 实例调用方法:

    • 是统一接口
    • 处理通用逻辑
    • 调用抽象方法

具体的调用差异

forward__call__ 的区别和调用时机:

  1. 基本区别:
# forward 是抽象方法,需要子类实现
@abc.abstractmethod
def forward(self, attn, is_cross: bool, place_in_unet: str):raise NotImplementedError# __call__ 是实例调用方法,可以直接调用对象
def __call__(self, attn, is_cross: bool, place_in_unet: str):# 调用 forward 并处理其他逻辑if self.cur_att_layer >= self.num_uncond_att_layers:h = attn.shape[0]attn[h // 2 :] = self.forward(attn[h // 2 :], is_cross, place_in_unet)# ... 其他逻辑
  1. 调用时机:

__call__ 的调用:

controller = AttentionStore()
# 直接调用对象时会触发 __call__
result = controller(attn, is_cross=True, place_in_unet="down")

forward 的调用:

# forward 是在 __call__ 内部被调用的
# 不会直接调用 forward
  1. 工作流程:
# 1. 当调用 controller(attn, ...) 时,会触发 __call__
# 2. __call__ 方法会:
#    - 检查条件
#    - 调用 forward
#    - 更新计数器
#    - 处理步骤间逻辑
# 3. forward 方法(由子类实现)处理具体的注意力计算
  1. 实际应用示例:
# 在 AttentionStore 中
def forward(self, attn, is_cross: bool, place_in_unet: str):# 存储注意力值key = f"{place_in_unet}_{'cross' if is_cross else 'self'}"if attn.shape[1] <= 32**2:self.step_store[key].append(attn)return attn# 在 AttentionReplace 中
def forward(self, attn, is_cross: bool, place_in_unet: str):# 替换注意力值return torch.einsum("hpw,bwn->bhpn", attn_base, self.mapper)
  1. 为什么这样设计:

a) 分离关注点:

  • __call__ 处理通用逻辑(计数、步骤等)
  • forward 处理具体实现(存储、替换等)

b) 提供统一接口:

  • 所有控制器都可以像函数一样调用
  • 内部实现可以不同

c) 代码复用:

  • 通用逻辑在 __call__ 中实现一次
  • 子类只需要实现 forward
  1. 调用顺序:
# 1. 外部调用
controller(attn, is_cross=True, place_in_unet="down")# 2. 触发 __call__
def __call__(self, attn, is_cross: bool, place_in_unet: str):# 3. 条件检查if self.cur_att_layer >= self.num_uncond_att_layers:# 4. 调用 forwardattn[h // 2 :] = self.forward(attn[h // 2 :], is_cross, place_in_unet)# 5. 处理其他逻辑

这种设计的好处是:

  1. 提供了清晰的接口
  2. 分离了通用逻辑和具体实现
  3. 方便代码复用和维护
  4. 使代码结构更加清晰

所以,在这个例子中 forward__call__ 的区别在于:

  • __call__ 是外部接口,处理通用逻辑
  • forward 是内部实现,处理具体功能
  • 它们共同工作,提供了灵活且统一的接口
http://www.dtcms.com/wzjs/259094.html

相关文章:

  • 深圳罗湖外贸网站建设友情链接实例
  • 怎么进入网站管理页面百度手机助手下载安装最新版
  • 如何给喜欢的明星做网站网站快速排名服务
  • 做网站要多少钱新乡阿里巴巴指数查询
  • 网站开发功能确认单网络营销的10个特点
  • 网站建设及优化教程关键词有哪几种
  • 基层政府门户网站建设的问题郑州网站推广公司哪家好
  • 网站自适应手机怎么刷赞网站推广ks
  • baby做网站汽车电商平台营销策划方案
  • 宝鸡做网站哪家公司好潍坊seo招聘
  • 开发一个网站需要哪些步骤如何让百度快速收录新网站
  • 手机网站优化网站开通
  • 网站备案几天营销型网站制作公司
  • 乐山沙湾区住房建设局网站网站排名费用
  • 高明区做网站互换链接的方法
  • 网站开发之ios知识扩展seo营销推广公司
  • 网站开发具体步骤天津百度网站快速优化
  • 图片切换wordpress宁波网站优化
  • 高端网站建设公司排名湖南网站设计外包哪家好
  • 网站界面设计案例分析抖音seo排名优化公司
  • 怎样做网站排名新乡百度网站优化排名
  • 做淘宝客需要网站吗南京今天重大新闻事件
  • 政府门户html网站模板近三年成功的营销案例
  • 益阳市建设网站网站推广系统
  • 石家庄做网站wsjz网球排名即时最新排名
  • 公司做网站佛山seo优化外包
  • 全球贸易中心网惠州seo优化服务
  • 街景地图可移动引擎优化seo是什么
  • 用别人网站做app的危害网站seo排名培训
  • 临沂手机网站建设网络营销事件