说我有课:
{% for attend in attends %}
<td>
{% for attenddate in attend.absentdate_set.all %}
{{ attends.attenddate.date }}
{% endfor %}
</td>
{% endfor %}
现在我希望能够翻译给定数据对象的列......
class Data():
def __init__(self):
self.scores = []
self.encoding= {1: 'first', 2: 'second', 3:'third'}
def build():
self.scores = [1, 2, 3]
def translate(self):
return [self.encoding[score] for val in self.scores]
现在我完全清楚我正在尝试访问该列表不存在的方法(translate())。我希望能够进行如上所述的方法调用(d.scores.translate()),因为我可能有一些特定的d.scores子片段我想翻译。
例如,如果d.scores是一个嵌套的numpy数组(我只想翻译前5列,但保留所有行)
# I want to be able to do
d= Data()
d.scores.translate()
# AttributeError: 'list' object has no attribute 'translate'
# Instead of
d= Data()
d.translate()
我知道这更像是一个实施问题,我想知道最佳实践应该是什么。
我是否试图在这一点上将一个方形钉子推入一个圆孔?我应该放弃并定义模块功能还是考虑kwargs?这更像是'pythonic'吗?
更新
我应该早点说出来,但我确实尝试过使用kwarg和staticmethod路线。我只想知道是否有其他方法可以实现这一目标?也许通过子类化?或Python相当于java / C#中的接口(如果存在?)
答案 0 :(得分:2)
是的,你正试图“将一个方形钉子压入一个圆孔”。
您的翻译方法适用于整个分数列表,完整停止。这不能用一些技巧来改变,这在Python中根本不受支持。
如果你想做瑕疵,我建议明确地做。
示例:
# Using args/kwargs:
scores = john.translate(10, 15) # translate subslice 10:15
# Using a new static method:
scores = Person.translate_scores(john.scores[10:15])
看起来不那么优雅,但很有效。
(顺便说一句:既然你改变了你的问题,我的课程可能会有一些,但我不会在每次编辑时改变我的答案)
你的诡计根本行不通,因为“得分”不是你主类的某些部分,而只是它的一个属性,它有自己的类型。因此,当你执行“d.scores.translate()”时,不会在d上调用translate,而是在列表或任何类型的分数上调用。你无法改变它,因为它是核心Python。
答案 1 :(得分:0)
你可以通过使用第二个类并使用_scores作为列表和一个操纵_scores的子对象得分来实现:
class DataHelper(object):
def __init__(self, data_obj):
self.data_obj = data_obj
def translate(self, *args):
... # work on self.data_obj._scores
class Data(object):
def __init__(self):
self.scores = DataHelper(self)
self._scores = []
使用这样的类结构,您可能能够:
scores = d.scores.translate(1, 5)
有了更多的诡计,你甚至可以做到:
scores = d.scores[1:5].translate()
但是为此,你需要一个第三类(它的对象将在索引分数对象上临时创建,因此d.scores [1:5]不会创建一个列表切片而是一个带有translate方法的新对象)