- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果某个类扩展了 abc 类(抽象基类),那么除非我定义所有抽象方法,否则我无法实例化它。但通常在实现装饰器模式时,我只想定义一些抽象方法,而其他方法 - 只是委托(delegate)给装饰对象。这该怎么做?
例如,我想让以下代码工作:
from abc import ABCMeta, abstractmethod
class IElement(object):
__metaclass__ = ABCMeta
@abstractmethod
def click(self):
return
@abstractmethod
def hover(self):
return
# ... more IElement's abstractmethods...
class StandardElement(IElement):
def click(self):
return "click"
def hover(self):
return "hover"
# ... more implemented IElement's methods...
class MyElement(IElement):
def __init__(self, standard_element):
self._standard_element = standard_element
delegate(IElement, standard_element)
def click(self):
return "my click"
assert MyElement(StandardElement()).click() == 'my click'
assert MyElement(StandardElement()).hover() == 'click'
from abc import ABCMeta, abstractmethod
class IElement(object):
__metaclass__ = ABCMeta
@abstractmethod
def click(self):
return
@abstractmethod
def hover(self):
return
# ... more IElement's abstractmethods...
class StandardElement(IElement):
def click(self):
return "click"
def hover(self):
return "hover"
# ... more implemented IElement's methods...
class MyElement(IElement):
def __init__(self, standard_element):
self._standard_element = standard_element
def click(self):
return "my click"
def hover(self):
return self._standard_element.hover()
# ... more manually delegated IElement's methods to self._standard_element object, aggregated in initialiser...
assert MyElement(StandardElement()).click() == 'my click'
assert MyElement(StandardElement()).hover() == 'click'
delegate
上面例子中的方法。如何实现?也可以考虑为扩展 abc 类的类提供自动委托(delegate)的一些其他方法。
class MyElement(StandardElement)
) 作为解决方案...上面提供的代码只是一个示例。在我的真实案例中,MyElement 与 StandardElement 相比完全不同。不过,我必须使 MyElement 与 StandardElement 兼容,因为有时有人应该使用 MyElement 而不是 StandardElement。我真的需要在这里实现“有”关系,而不是"is"。
最佳答案
默认情况下,没有自动方式来执行您想要的委派。委派并不是抽象类的显式部分,所以这并不奇怪。但是,您可以编写自己的委托(delegate)元类,为您添加缺少的方法:
def _make_delegator_method(name):
def delegator(self, *args, **kwargs):
return getattr(self._delegate, name)(*args, **kwargs)
return delegator
class DelegatingMeta(ABCMeta):
def __new__(meta, name, bases, dct):
abstract_method_names = frozenset.union(*(base.__abstractmethods__
for base in bases))
for name in abstract_method_names:
if name not in dct:
dct[name] = _make_delegator_method(name)
return super(DelegatingMeta, meta).__new__(meta, name, bases, dct)
name
创建函数后不会更改。在 Python 3 中,您可以在
__new__
中执行所有操作。通过给出
delegator
的方法具有默认值的仅关键字参数,但 Python 2 中没有仅关键字参数,因此对您不起作用。
class MyElement(IElement):
__metaclass__ = DelegatingMeta
def __init__(self, standard_element):
self._delegate = standard_element
def click(self):
return "my click"
self._delegate
设置元类创建的方法将使用的对象。如果你愿意,你可以把它做成某种方法,但这似乎是最简单的方法。
关于python - 扩展python abc类的类的自动委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309627/
我在 JavaScript 中使用正则表达式负前瞻来使用正则表达式匹配替换字符串中最后一次出现的字符串。 这是我的代码片段: var str = 'abc abc abc' var regex1 =
许多报告和开发团队必须使用该条件 where ABC>='00' and ABC='00' and ABC='0' and ABC ='00' 且 ABC ='0' 且 ABC< ='Z',我们在St
这个问题已经有答案了: What is the Java string pool and how is "s" different from new String("s")? [duplicate]
我有一个很长的正则表达式 (JavaScript),它包含以下构造: ((\\\\)|(\\[abc])|([^abc]))* 正则表达式表示: 匹配任何不包含字母 a、b 和 c 的字符串。 除非它
In [29]: re.findall("([abc])+","abc") Out[29]: ['c'] In [30]: re.findall("[abc]+","abc") Out[30]: ['
这个问题在这里已经有了答案: What is the difference between "text" and new String("text")? (13 个答案) 关闭 8 年前。 Stri
我正在尝试创建一个简单的抽象基类 Abstract它和它自己的方法一起提供了另外两个抽象基类的方法:Publisher和 Subscriber .当我尝试初始化具体类时 Concrete , 建立在
我正在学习如何使用egrep命令,我想找到一些在一行中重复3个字符的单词(例如,abc-abc-abc; ssd-ssd-ssd)。 我尝试了一些命令,例如 egrep '[a-z][a-z][a-z
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
太晚了,我还不太明白。 我的文字看起来像这样: This is a [;;Text] and I want to match [center]everything without ;;[/cente
我有 junit 测试用例,我按以下方式使用了 Spy ,并且 Junit 在以下情况下失败。 @Spy private Abc abc; 但是运行成功。 @Spy Abc abc = new A
"abc def" "abcd efgh" 如果我有一个大字符串,其中有一个空格分隔两个不同长度的子字符串,那么从较大字符串中提取每个子字符串的最佳方法是什么? 因为这是一个字符串而不是数组,数组语法
我想知道 MySQLBDDColumns.Text 中是否存在值“Type de prise” 我得到了我想知道的值是否包含在 Texte_Caractéristiques.Text 但只有我有值“T
这个问题已经有答案了: What is the purpose of the var keyword and when should I use it (or omit it)? (19 个回答) 已
我试图找到一个正则表达式来匹配具有字符串“question”但不具有或不包含字符串“ion”的所有字符组合。 例子: questionxxxx ------>匹配 xxxquestion-------
我想使用正则表达式从文件中读取特定字符之间的多个字符串。我已经尝试了以下代码,但无法获得预期的结果。 我的输入文件包含以下格式的数据: #*OQL[C++]: Extending C++ with a
这个问题已经有答案了: Are double and single quotes interchangeable in JavaScript? (23 个回答) 已关闭 7 年前。 jQuery 中
我有一个工作函数: $('#hints').after( 'Hint 1' ) 我正在尝试编辑data-content="Hint 1 Content"使用 jQuery。 我的职能是: fun
这里有两个简单的类: class Abc { public int x; } class Bcd { public int y; } 鉴于 obj 是 object 类型,这里有几个测试 Abc 或
我在严格的 Java 环境中。 所以这个问题并不像标题中那么简单,我不是要解决我遇到的问题,它更理论化,以获得更好的知识。 我感兴趣的是用双引号或单引号匹配 src,但如果是双引号,它也必须用双引号结
我是一名优秀的程序员,十分优秀!