【问题标题】:Having both a method and a function which do the same thing?同时拥有做同样事情的方法和函数?
【发布时间】:2016-08-01 01:54:50
【问题描述】:

对于如何让一个方法和一个函数做同样的事情(或者是否完全这样做)有一个约定吗?

例如,考虑

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)

或者干脆把方法全部去掉,只用一个函数?还是别的什么?

【问题讨论】:

    标签: python function methods


    【解决方案1】:

    这是一个替代方案,它仍然允许您将逻辑封装在 MyDie 中。在MyDie中创建类方法

    @staticmethod
    def count_specified_values(random_func, number_of_values):
       return Counter([randoms_func() for n in range(number_of_values)])
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 2021-05-02
      • 2017-12-03
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多