当函数需要class属性时,在python中覆盖绑定方法

时间:2018-05-29 20:22:25

标签: python python-3.x oop

说我有课:

{% 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#中的接口(如果存在?)

2 个答案:

答案 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方法的新对象)