是否始终需要使用\uu init\uu?

2024-05-08 11:12:48 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧。所以我看到有人在用这个代码,我明白了,所以我要用它。 是否有必要使用__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!')

我不能这样做:

^{pr2}$

当我这样做的时候,我会得到“你好,水手!”但我的下面有个“无”?这和__init__有关吗?有人解释。在


Tags: 代码selfhelloobjectfooinitdefmethod
2条回答

你的要求与__init__没有太大关系。你可以按照你在第二个例子中说的去做,但是它和第一个例子做的不一样。在

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

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

在第二个例子中,它总是打印“你好,水手!”你不能让它打印其他东西。在

至于__init__,在您的示例中,__init__并没有那么有用,因为它所做的只是为每个对象设置一个属性x,该属性对每个对象都是相同的字符串。如果要在创建每个对象时“设置”,则应使用__init__。在您的例子中,这个设置没有那么有趣,因为对于每个对象它总是相同的。您不需要使用__init__,但是创建没有附加某种单独状态的对象通常没有多大意义。下面是一个更具说明性的例子:

^{pr2}$

然后你可以这样做:

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

在这里,当您创建Greeter时,您可以指定问候语。该问候语与对象一起存储,并在它是某人时使用。__init__的要点是,您可以用不同的问候语制作多个问候语。在

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

通常情况下,您将在代码中混合这两种情况。有些信息是“对象的一部分”,您将在__init__中处理它们并将它们存储在对象上。其他一些则是更具体或短暂的信息,您将把它们作为函数参数传递给您要执行的每个任务。这两者之间的平衡取决于类应该做什么,但是上面的例子应该说明它们之间的区别。在

而且,这两个都与为什么你看到“没有”印刷无关。jimbob博士解释了为什么会发生这种情况。在

如果创建对象时不需要设置任何属性或进行任何其他初始化,则可以安全地省略__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来显示它。在

或者如果你有:

^{pr2}$

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

相关问题 更多 >