【问题标题】:Send dictionary parameters to class method called inside __init__将字典参数发送到在 __init__ 中调用的类方法
【发布时间】:2021-09-21 05:15:51
【问题描述】:

我想增强下面的人工示例

class Record:
    def __init__(self, data):
        self.data = data

    def filter(self, positive = False, even = False):
        data_ = self.data
        if positive:
            data_ = [c for c in data_ if c>0]
        if even:
            data_ = [c for c in data_ if c % 2 ==0]
        self.data = data_

data = list(range(-5,10,1))
record = Record(data)
record.filter(positive=True, even=True)
print(record.data)

正确打印[2,4,6,8],以便在初始化记录实例时请求过滤。我的做法是

class Record:
    def __init__(self, data, filter = {}):
        self.data = data
        if len(filter) > 0:
            self.filter(**filter)


    def filter(self, positive = False, even = False):
        data_ = self.data
        if positive:
            data_ = [c for c in data_ if c>0]
        if even:
            data_ = [c for c in data_ if c % 2 ==0]
        self.data = data_

data = list(range(-5,10,1))
record = Record(data,filter={positive:True, even:True})
print(record.data)

并且(自然...)我收到错误NameError: name 'positive' is not defined

这里如何进行,一般来说,将方法嵌入到初始化中是否是一个正确的想法?

【问题讨论】:

  • 你的字典语法没有引号是无效的:filter={"positive":True, "even":True}.

标签: python class initialization


【解决方案1】:

您不必创建字典来传递参数。这也可以:

class Record:
    def __init__(self, data, **args):
        self.data = data
        self.filter(**args)
    def filter(self, positive=False, even=False):
        ...

f1 = Record(data)    # both positive and even will be False
f2 = Record(data, positive=True)
f3 = Record(data, even=True)
f4 = Record(data, even=True, positive=True)

这还有一个额外的好处,即您在整个代码中始终如一地对待 evenpositive,避免在某些时候将它们作为字符串引用。

【讨论】:

  • 非常感谢!当我读到这个的时候,听起来很自然,但是当我问的时候我没能认出这个技巧:-)
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2018-07-18
  • 2021-07-21
  • 2011-11-06
  • 2020-04-26
相关资源
最近更新 更多