将字典参数发送到 class 内部调用的方法 __init__

Send dictionary parameters to class method called inside __init__

我想增强下面的人工例子

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],因此可以在 Record 实例初始化时请求过滤。我的做法是

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

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

您不必创建字典来传递参数。这也行得通:

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,避免在某些时候必须将它们作为字符串引用。