同时拥有一个方法和一个函数做同样的事情?

时间:2016-07-31 17:07:12

标签: python function methods

是否存在关于如何使方法和函数执行相同操作(或者是否完全执行此操作)的约定?

例如,考虑一下

from random import choice
from collections import Counter

class MyDie:
    def __init__(self, smallest, largest, how_many_rolls):
        self.min = smallest
        self.max = largest
        self.number_of_rolls = how_many_rolls

    def __call__(self):
        return choice( range(self.min, self.max+1) )

    def count_values(self):
        return Counter([self() for n in range(self.number_of_rolls)])

def count_values(randoms_func, number_of_values):
    return Counter([randoms_func() for n in range(number_of_values)])

其中count_values既是方法也是函数。

我觉得拥有这个方法真好,因为结果"属于" MyDie对象。此外,该方法可以从MyDie对象中提取属性,而无需将它们传递给count_values。另一方面,拥有该功能以便对MyDie以外的功能进行操作很不错,例如

count_values(lambda: choice([3,5]) + choice([7,9]), 7)

最好如上所述(代码重复;假设函数是一段较长的代码,而不仅仅是一行)或用

替换count_values方法
def count_values(self):
    return count_values(self, number_of_rolls)

或者只是一起摆脱这个方法而只是有一个功能?或者别的什么?

1 个答案:

答案 0 :(得分:0)

这是一个替代方案,仍允许您将逻辑封装在MyDie中。在MyDie

中创建一个类方法
@staticmethod
def count_specified_values(random_func, number_of_values):
   return Counter([randoms_func() for n in range(number_of_values)])

您还可以使用默认值向构造函数添加其他形式参数,您可以覆盖它们以实现相同的功能。