python类通常具有以下形式的__init__
方法:
class myclass:
def __init__(self, value):
self.value = value
方法参数和实例变量的简单分配感觉就像不必要的代码。据我了解,以下不起作用:
class myclass:
def __init__(self, self.value):
pass
我总是必须用这些简单的作业编写__init__
方法。
这是对的吗?
答案 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'])