总是需要__init__吗?

时间:2014-03-24 04:43:56

标签: 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!')

我不能做这样的事情:

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

a = A()
print a.method_a()

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

2 个答案:

答案 0 :(得分:7)

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

在第一个例子中,它打印" Hello"然后是您传递给方法的参数。除了" sailor"通过传递其他内容:

>>> a.method_a('buddy!')
Hello buddy!

在第二个例子中,它总是打印" 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 + "!"

然后你可以这样做:

>>> hello = Greeter("hello")
>>> hello.greet('sailor')
hello, sailor!
>>> howdy = Greeter('Howdy')
>>> howdy.greet('partner')
Howdy, partner!

在此处,当您创建Greeter时,您可以指定问候语。该问候语与对象一起存储,并在greet某人使用时使用。 __init__的要点是,您可以使用不同的问候语进行多个欢迎。

请注意,当我致电greet时,我仍然会传递给该人。因此,当我创建对象时设置问候语(在此示例中为hello或howdy),但每次将对象用于greet时,都会重新指定要问候的人。

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

此外,这些都与你为何看到"无"无关。打印。 dr_jimbob解释了为什么会这样。

答案 1 :(得分:3)

如果在创建对象时不需要设置任何属性或对对象进行任何其他初始化,则可以安全地省略__init__。您获得None的原因是method_a()没有返回类型。因此,当您打印它时,您会得到None

如果你有:

class A(object):
    def method_a(self):
        return "Hello, Sailor!"
a = A()
print a.method_a()

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

或者如果你有:

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

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