Python oop:__ init__类的方法经常有琐碎的赋值self.value = value

时间:2016-01-26 16:01:36

标签: python oop

python类通常具有以下形式的__init__方法:

class myclass:
     def __init__(self, value):
        self.value = value

方法参数和实例变量的简单分配感觉就像不必要的代码。据我了解,以下不起作用:

class myclass:
     def __init__(self, self.value):
        pass

我总是必须用这些简单的作业编写__init__方法。

这是对的吗?

5 个答案:

答案 0 :(得分:5)

它不只是执行任务;它本质上也是"声明"您的实例变量。是的,没有什么能阻止您在对象生命周期中随时添加更多实例变量,但按照惯例,您在__init__中分配的属性提供了事实上的定义类的实例上可用的属性。

答案 1 :(得分:2)

是的,你是对的:你必须始终在__init__内完成这些作业。

答案 2 :(得分:2)

总的来说 - 是的。除非你说出来,否则Python无法知道你对FFIArray__init__的参数有什么看法。

根据您希望班级做什么,您可以使用关键字参数和setattr。

__init__

答案 3 :(得分:2)

我已经使用了以下多年:

def MyClass:
    def __init__(self, some_var, some_other_var, some_kwarg=None):
        self.__dict__.update(locals())

对我而言,这清楚地表明我想要将传递给__init__的所有变量声明为实例变量,但对于不熟悉Python类的人来说可能不是这样,所以谨慎使用它。

它的作用本质上是将所有局部范围变量推送到实例的变量字典。您甚至可以将它与**kwargs(使用Python 3.5语法)结合使用:

def MyClass:
    def __init__(self, some_var, some_other_var, some_kwarg=None, **kwargs):
        self.__dict__.update({**locals(), **kwargs})

允许将任意关键字参数推送到实例的变量范围中,但我强烈反对这种用法用于大多数目的。

答案 4 :(得分:1)

如果课程中没有其他内容,您可以尝试namedtuple

myclass = namedtuple('myclass', ['value'])