>> one().number_fisher() 'one fish' >>-6ren">
gpt4 book ai didi

python - 以类属性作为参数的方法工厂

转载 作者:行者123 更新时间:2023-12-01 06:15:51 24 4
gpt4 key购买 nike

我发现创建用某种逻辑包装参数化对象属性的“方法工厂函数”很有用。

例如:

"""Fishing for answers.

>>> one().number_fisher()
'one fish'
>>> one().colour_fisher()
'red fish'
>>> two().number_fisher()
'two fish'
>>> two().colour_fisher()
'blue fish'
"""


class one(object):
def number(self):
return 'one'
def colour(self):
return 'red'
def _make_fisher(sea):
def fisher(self):
return '{0} fish'.format(getattr(self, sea)())
return fisher
number_fisher = _make_fisher('number')
colour_fisher = _make_fisher('colour')

class two(one):
def number(self):
return 'two'
def colour(self):
return 'blue'

是否有必要将属性作为字符串传递给 make_fisher,或者有更好的方法吗?

如果我传递并使用实际属性,这将破坏多态性,因为 two 的实例仍将使用对属性对象的相同引用。

即:

diff --git a/fishery.py b/fishery.py
index 840e85d..b98cf72 100644
--- a/fishery.py
+++ b/fishery.py
@@ -4,10 +4,12 @@
'one fish'
>>> one().colour_fisher()
'red fish'
+
+This version does not implement polymorphism, and so this happens:
>>> two().number_fisher()
-'two fish'
+'one fish'
>>> two().colour_fisher()
-'blue fish'
+'red fish'
"""


@@ -18,10 +20,10 @@ class one(object):
return 'red'
def _make_fisher(sea):
def fisher(self):
- return '{0} fish'.format(getattr(self, sea)())
+ return '{0} fish'.format(sea(self))
return fisher
- number_fisher = _make_fisher('number')
- colour_fisher = _make_fisher('colour')
+ number_fisher = _make_fisher(number)
+ colour_fisher = _make_fisher(colour)

class two(one):
def number(self):

必须使用字符串来引用该属性似乎有点弱,但我没有看到其他方法来做到这一点。有吗?

最佳答案

“多一层间接”(有时被认为是编程的 Elixir ;-)——就像像 property 这样的典型装饰器。例如:

def makefisher(fun):
def fisher(self):
return '{0} fish'.format(fun(self))
return fisher

class one(object):
def number(self): return self._number()
def _number(self): return 'one'
number_fisher = makefisher(number)

class two(one):
def _number(self): return 'two'

基本上,您包装的函数是模板方法 DP 的一种特别简单的变体中的“组织函数”,而您覆盖的函数是同一 DP 中的“ Hook 函数”。或者至少,这是看待它的一种方式,另一种是我一开始使用的“额外的间接级别”;-)。

关于python - 以类属性作为参数的方法工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3377014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com