总是需要__init__吗?

jpe*_*ped 5 python class init self

好的.所以我看到有人使用这个代码,我明白了,所以我将使用它.有必要__init__吗?

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

a = A() 
a.method_a('Sailor!')
Run Code Online (Sandbox Code Playgroud)

我不能做这样的事情:

class A(object):
    def method_a(self):
        print "Hello, Sailor!"

a = A()
print a.method_a()
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我确实得到了"你好,水手!" 但我在它下面有一个"无"?那与此有关__init__吗?有人解释.

Bre*_*arn 7

你所要求的并没有多大关系__init__.您可以在第二个示例中执行您所说的操作,但它与第一​​个示例的操作不同.

在第一个示例中,它打印"Hello",后跟您传递给方法的参数.您可以通过传递其他内容使其打印除"水手"以外的内容:

>>> a.method_a('buddy!')
Hello buddy!
Run Code Online (Sandbox Code Playgroud)

在第二个例子中,它总是打印"Hello,Sailor!" 你不能让它打印任何其他东西.

至于__init__,在你的例子中,__init__它没那么有用,因为它所做的就是x为每个对象设置一个相同字符串的属性.__init__如果要在创建时"设置"每个对象,则应该使用它.在您的示例中,此设置不是那么有趣,因为它对于每个对象始终是相同的.你不需要使用__init__,但通常不是在创造不具备某种连接到他们个人状态的对象多点.这是一个更具说明性的例子:

class Greeter(object):
    def __init__(self, greeting):
        self.greeting = greeting

    def greet(self, who):
        print self.greeting + ", " + who + "!"
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

>>> hello = Greeter("hello")
>>> hello.greet('sailor')
hello, sailor!
>>> howdy = Greeter('Howdy')
>>> howdy.greet('partner')
Howdy, partner!
Run Code Online (Sandbox Code Playgroud)

在这里,当您创建一个时Greeter,您可以指定问候语.该问候语与对象一起存储,并在任何greet人使用时使用.关键__init__是你可以用不同的问候制作多个迎宾员.

请注意,我打电话时仍然会打电话给那个人greet.因此,当我创建对象时设置问候语(在此示例中为hello或howdy),但每次使用对象时都会重新指定要问候的人greet.

通常,您会在代码中混合使用这两种内容.某些信息是"对象的一部分",您将处理它们__init__并将它们存储在对象上.其他是更具体或短暂的信息,您将作为要执行的每项任务的函数参数传递.这些之间的平衡取决于班级应该做什么,但上面的例子应该说明不同之处.

此外,这些都与您为什么看到"无"打印有任何关系.dr_jimbob解释了为什么会这样.


dr *_*bob 4

__init__如果您不需要在创建对象时设置任何属性或对其进行任何其他初始化,则可以放心地忽略该操作。您得到的原因None是您的method_a(). 所以当你打印它时,你会得到None.

如果你有:

class A(object):
    def method_a(self):
        return "Hello, Sailor!"
a = A()
print a.method_a()
Run Code Online (Sandbox Code Playgroud)

您将看不到None(因为method_a返回一个字符串),然后您调用print该字符串来显示它。

或者如果你有:

class A(object):
    def method_a(self):
        print "Hello, Sailor!"
a = A()
a.method_a()
Run Code Online (Sandbox Code Playgroud)

这次调用method_a会打印字符串,但由于您没有打印此结果(只是调用它),因此您看不到None显示的结果。