python 中的方法委托

2023-12-29

我正在编写一个用于编排 AWS 集群的小型框架,并且有一些反复出现的常见分层模式。一种这样的模式是将实例集合收集到一个更大的对象中,然后将一些方法直接委托给所有实例。因此,我没有一遍又一遍地复制和粘贴相同的样板代码,而是使用以下模式对其进行了抽象:

def __getattr__(self, item):
    if not item in self._allowed_items:
        raise NonDelegatableItem

    def delegator():
        for instance in self.all_instances:
            getattr(instance, item)()

    return delegator

有没有更好的方式或模式来完成委托?


__getattr__当遍历整个类层次结构并且没有找到该属性时调用。所以最好生成一次方法并将其存储在类中。那么下次找到方法就可以花更少的时间。

>>> X.a

Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    X.a
AttributeError: class X has no attribute 'a'
>>> x.a
new delegator
<function delegator at 0x02937D30>
>>> x.a
<bound method X.delegator of <__main__.X instance at 0x028DBC60>>
>>> X.a
<unbound method X.delegator>

在这里您可以看到代码的调整来做到这一点:

class NonDelegatableItem(AttributeError):
    pass

class X:
    def __getattr__(self, method_name):
        self.check_method_name_is_delegator(method_name)
        return self.create_delegator(method_name)

    def check_method_name_is_delegator(self, method_name):
        if method_name not in self._allowed_items:
            raise NonDelegatableItem('{} can not be delegated'.format(method_name))

    @classmethod
    def create_delegator(cls, method_name):
        print 'new delegator'
        def delegator(self, *args, **kw):
            self.check_method_name_is_delegator(method_name)
            for instance in self.all_instances:
                getattr(instance, method_name)(*args, **kw)
        setattr(cls, method_name, delegator)
        return delegator


x = X()

x._allowed_items = ['a', 'b']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 中的方法委托 的相关文章

随机推荐

  • 将 Column(str) 转换为 (Float) ,ValueError: 无法将字符串转换为 float: 'Null'

    对不起 各位 我知道这个问题之前已经被回答过 我尝试了所有答案 也进行了研究 并尝试了不同的事情 4 个小时 我无法完成 我相信我的数据有一些奇怪的东西 所以按照我的数据和我的尝试 x pd DataFrame Cost 83 534625
  • 在膨胀布局中使用 setText() 到 TextView() 后,文本不显示

    是的 我知道以前有人问过类似的问题 但我尝试了很多 所以我在膨胀布局中的 TextView 中设置文本时遇到问题 我尝试了 setContentView 然后它可以工作 但是带有菜单的 Activity main xml 无法工作 所以我尝
  • Google AdSense 的 400 错误请求

    我正在运行一个使用 AJAX 请求和 History pushState 进行导航的网站 请求的内容代码包含Google的异步AdSense代码
  • ^= 32 将小写字母转换为大写字母,反之亦然,背后的想法是什么?

    我正在解决 codeforces 上的一些问题 通常我首先检查字符是大写还是小写英文字母 然后减去或添加32将其转换为相应的字母 但我发现有人这么做 32做同样的事情 这里是 char foo a foo 32 char bar A bar
  • 什么是可组合运行时类?

    我正在尝试使用 C WinRT 创建一个简单的 xaml 应用程序 我有 WPF 背景 拥有一个基类是很常见的 实现 INotifyPropertyChanged 并让其他类继承它 当我尝试对 C WinRT 执行相同操作时 我失败并出现错
  • 面向列的数据库与面向行的数据库

    我已经使用了很长时间的面向行的数据库设计 除了数据仓库项目和大数据示例之外 我还没有在 OLTP 应用程序中使用面向列的数据库设计 我的面向行的表看起来像 ID Make Model Month Miles Cost 1 BMW Z3 12
  • 如何跳出多个循环?

    给出以下代码 不起作用 while True Snip print out current state while True ok get input Is this ok y n if ok lower y break 2 This do
  • 从 Visual Studio 2019 将 ASP.NET Core 3.1 站点发布到 Azure 时出错

    我有一个预先存在的ASP NET 核心 3 0应用程序已成功部署到Azure 应用服务 使用AspNetCoreModuleV2模块 将应用程序升级到 今天发布的 后ASP NET 核心 3 1 应用程序在我的本地版本上正确构建并运行IIS
  • 从配置中读取 Azure 函数设置

    我使用带有属性的 Azure Functions 来定义功能 public static class PostPublishTimerTrigger FunctionName PostPublishTimerTrigger public s
  • 类型错误:createSlice 不是 vitest 中的函数

    我正在构建一个 tic tac toe 游戏 与 redux 进行反应 并尝试使用 vitest 进行测试 我已经设置了板片和商店 但是当尝试运行我的第一个测试时 我收到以下错误 Failed Suites 1 FAIL src slice
  • 将 NSArray 复制到空 NSArray 中

    我有第一个 NSArrayfirstArray我做 firstArray removeAllObjects 当我想用另一个数组的内容填充它之后secondArray 这样写对吗 firstArray secondArray No first
  • Haskell 中的素筛

    我对 Haskell 很陌生 我只是想找到前 200 万个素数的总和 我正在尝试使用筛子生成素数 我认为埃拉托色尼筛子 但它真的很慢 我不知道为什么 这是我的代码 sieve x xs x sieve filter a gt a mod x
  • 使用entityManager.createNativeQuery(query,foo.class)

    我想从 a 返回一个整数列表 javax persistence EntityManager createNativeQuery call 为什么下面的说法是错误的 entityManager createNativeQuery Selec
  • Altair 图表上方的动态文本

    在下面代码生成的图表中 用户可以将鼠标悬停在线段上以在图表上显示一个点 并且该点的信息显示在图表上方 import altair as alt import numpy as np import pandas as pd df pd Dat
  • 类似命名元组的类

    当我需要一个快速的一次性类时 我发现自己经常在我的 python 代码中编写这个类 class Struct object def init self kwargs for k in kwargs setattr self k kwargs
  • find 和 xarg 组合上需要计数器

    所以我有这个代码 find cobacoba type f xargs n 5 bash c a 0 1 2 3 4 echo File a 希望结果 File cobacoba 1 3 cobacoba 1 6 cobacoba 1 q
  • 内容提供程序不与 SqliteDatabase 同步

    我有 2 项活动 ActivityA通过Content Provider访问数据库 并启动ActivityB ActivityB直接访问数据库 我发现之后ActivityB更新了数据库 ActivityA通过CP查询数据库 结果不会更新 但
  • Android 从服务获取屏幕尺寸

    我通过使用活动中的以下内容获得了屏幕尺寸 Display display getWindowManager getDefaultDisplay 但同样的事情在服务中不起作用 出于明显的原因 我知道 但我迫切需要从服务中获取显示尺寸 有人可以
  • AppleScript 或 Automator 用于单击应用程序中的菜单?

    我不确定这是否可以通过 AppleScript 和 或 Automator 实现 但我希望能够 a 启动一个应用程序 我知道这可以通过 AppleScript 或 Automator 轻松完成 b 应用程序启动后 使用 AppleScrip
  • python 中的方法委托

    我正在编写一个用于编排 AWS 集群的小型框架 并且有一些反复出现的常见分层模式 一种这样的模式是将实例集合收集到一个更大的对象中 然后将一些方法直接委托给所有实例 因此 我没有一遍又一遍地复制和粘贴相同的样板代码 而是使用以下模式对其进行