Python中的类是否需要__init__构造函数?

sam*_*mpy 5 python oop constructor initialization class

我读到构造函数就像传递给类的第一个参数一样,这对我来说很有意义,因为参数似乎是通过__init__方法传递给类的。例如,

class NewsStory(object):
    def __init__(self, guid, title, subject, summary, link):
        self.guid = guid
        self.title = title
        self.subject = subject
        self.summary = summary
        self.link = link

    def get_guid(self):
        return self.guid

    def get_title(self):
        return self.title

    def get_subject(self):
        return self.subject

    def get_summary(self):
        return self.summary

    def get_link(self):
        return self.link
firstStory = NewsStory('Globally Unique Identifier', \
    'first_title','first_subject','This is an example \
    sumary','example_link@something.com')

print firstStory.get_guid() # prints Globally Unique Identifier
Run Code Online (Sandbox Code Playgroud)

因此,当我“调用”该类时,是否将__init__方法中的参数传递给它?我是班上的新手,我读到的所有内容我都很难理解和混淆。谢谢!

编辑1

我发现这个问题有助于解释某些事情,例如newinit之间的区别,抱歉,我不知道如何添加链接,必须剪切和粘贴:__init__可以做什么,__new__不能呢?

dir*_*obs 6

我在这里看到构造函数之间的误解 - 构造对象和初始化对象:

Python 的使用__new____init__?

使用__new__时,你需要控制一个创建新实例。使用__init__时,你需要一个新的实例的控件初始化。

所以我们在这里必须小心。

我读到构造函数就像传递给类的第一个参数,这对我来说很有意义,因为参数似乎是通过__init__方法传递给类的。

构造函数不会传递给类,准确地说,构造函数 ( __new__)的结果将是类或其子类中每个实例方法的第一个参数(注意:__new__仅适用于新式类):

class A:
    def __new__(self):
            return 'xyz'
Run Code Online (Sandbox Code Playgroud)

看看当你调用类(创建对象)时会发生什么:

>>> A()
'xyz'
>>> type(A())
<class 'str'>
Run Code Online (Sandbox Code Playgroud)

调用类不再返回类型的实例A,因为我们改变了构造函数的机制__new__。实际上,通过这样做,您改变了类的整个含义,不仅如此,这很难破译。您不太可能在该特定对象的创建期间切换对象的类型。我希望这句话有意义,如果没有,它在您的代码中如何有意义!

class A:
    def __new__(self):
            return 'xyz'

    def type_check(self):
            print(type(self))
Run Code Online (Sandbox Code Playgroud)

看看当我们尝试调用type_check方法时会发生什么:

>>> a = A()
>>> a
'xyz'
>>> a.type_check()
AttributeError: 'str' object has no attribute 'type_check'
Run Code Online (Sandbox Code Playgroud)

a不是 class 的对象A,所以基本上你不能A再访问 class了。

__init__用于初始化对象的状态。通过在创建期间初始化对象的成员__init__来解决此问题而不是调用将在创建后初始化对象成员的方法,因此,如果您name在类内部调用了一个成员,并且您想name在创建类时进行初始化而不是调用额外的方法init_name('name'),您肯定会__init__为此目的使用。

因此,当我“调用”该类时,我将__init__方法中的参数传递给它?

当你调用类时,你传递了参数(to)__init__方法?

无论您向类传递什么参数,所有参数都将传递给__init__并自动为您添加一个附加参数,该参数通常称为隐含对象self(实例本身),Python将始终自动将其作为最左边的参数传递:

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b 
Run Code Online (Sandbox Code Playgroud)
        A(  34,  35) 
 self.a = 34 |    |  
             |    | 
             |    | self.b = 35  
  init(self, a,   b)
        |
        |
        | 
       The instance that you created by calling the class A() 
Run Code Online (Sandbox Code Playgroud)

注意: __init__适用于经典类和新样式类。然而,__new__工程仅适用于新的样式类。